5、Maven聚合与继承

一、概要

软件设计人员往往会采用各种方式对软件划分模块,以得到更清晰的设计及更高的重用性。
Maven聚合特性,将项目的各个模块聚合在一起构建
Maven继承特性抽取各模块相同的依赖和插件等配置。

二、继承

1、概念

在父工程POM文件中声明复用依赖或插件等配置,安装到本地仓库即可由其他子项目继续。
在子项目POM文件中声明父工程。
同时子项目可省略groupId和version,因为子项目POM会隐式继承父项目POM的groupId和version。

2、基础使用

格式

...

  ...          
  ...    
  ...          
  ...

...

栗子

父POM文件


    4.0.0
    com.wener
    bd-shopping
    1.0-SNAPSHOT
    
    pom
    Shopping Maven Webapp
    http://www.example.com
    
        
        
            junit
            junit
            4.12
            test
        
    

子POM文件


    
        bd-shopping
        com.wener
        1.0-SNAPSHOT
        
        ../pom.xml
    
    war
    ...
    
      
    

说明

  • groupId、artifactId和version指定父模块的坐标是必须的。
  • relativePath表示父模块POM的相应路径。Maven首先从relativePath检查父POM,如果找不到则从本地仓库查找。默认值是 . ./pom.xml 。就是说,Maven默认父POM在上一层目录下。
  • 注意:如果父模块没有安装到本地仓库,relativePath路径存在问题,则找不到父POM,导致构件失败。如果根据relativePath找到父pom,它就不需要再检查本地仓库。

3、常用可继承的POM元素

元素 说明
groupId 项目组ID,项目坐标的核心元素
version 项目版本,项目坐标的核心元素
dependencies 项目的依赖配置
dependencyManagement 项目的依赖管理配置

5、依赖管理

当A,B继承D,当将A,B模块的所有依赖都写在D中的时候,现在添加C模块,但是C模块并不依赖某些构件。怎么办?

依赖管理配置

dependencyManagement 在该元素中声明的依赖不会被引入,而是起到约束并简化子项目依赖的作用,子项目会继承其声明的依赖配置,如version,scope。springboot项目的父工程应该是配置了该依赖管理配置,实现项目依赖无需填写版本号。
栗子



  
    
      org.springframework
      spring-context
      5.1.7.RELEASE
    
  



  
    org.springframework
    spring-context
  

栗子2

依赖范围

import: 只能在dependencyManagement元素中生效,可以导入其他项目的dependencyManagement配置


 
     
         ...
         ...
         ...
         pom
         import
     
     ...
 

栗子



  
    
      org.springframework.cloud
      spring-cloud-dependencies
      LATEST
      pom
      import
    
  


  
    org.springframework.cloud
    spring-cloud-starter
  
  
    org.springframework.cloud
    spring-cloud-starter-eureka-server
  
  
    org.springframework.boot
    spring-boot-starter-test
    test
  

6、插件管理

类似于dependencyManagement元素,pluginManagement元素用于管理插件,在该元素中配置的依赖不会造成实际的插件调用方式,可以理解为dependencyManagement 声明了插件依赖的配置,当其子类声明该插件依赖时,可复用该配置,起到约束和简化作用。
什么情况下可以用到依赖管理和插件管理,当一些依赖或插件依赖只有部分子模块需要时,应该由子模块自身去声明引入依赖并配置,而这些配置都是重复的,通过依赖管理和插件管理可以实现配置的复用,并且不会给其他模块引入不必要的依赖。

三、聚合

1、概念

Maven的继承特性可以抽取重复的配置。在父POM中声明一些配置供子类POM继承,实现"一处声明,多处使用"。
所谓聚合,实际上就是把项目拆分成多个模板,
实现聚合的最核心配置。用户可以通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块的聚合。

2、聚合声明



    
    
    
 

聚合时packaging必须是pom

3、栗子

bd-shoppin        pom  管理
├── bd-cart
│──── pom.xml     pom  购物车
├── bd-order
│   ├── pom.xml   pom 订单
├── bd-pay
│   ├── pom.xml   pom 支付
├── bd-shop
│   ├── pom.xml   pom 商品
└── pom.xml

四、聚合和继承的关系

聚合

为了方便快捷构件项目;对于聚合模块来说,它知道哪些被聚合的模块,被聚合的模块不知道这个聚合模块的存在。

继承

主要为了清除重复配置。父POM不知道哪些子模块,子模块知道父模块。

相同点

POM的packaging必须是pom。聚合模块与继承关系中的父模块除了POM之外没有实际的内容。在实际项目中,一个pom及时聚合pom又是父pom。

你可能感兴趣的:(5、Maven聚合与继承)