Maven专题2——聚合与继承
聚合
- 聚合模块的
<packaging>
元素为pom
- 聚合模块通过
<modules>
元素标识自己的子模块,每个子模块对应了一个module
元素 module
元素中指定的是子模块所在目录相对于聚合模块的POM文件的位置,
如果子模块与聚合模块的POM同级,则
module
元素应该是子模块所在的目录名
如果子模块与聚合模块同级,则module
元素应是../子模块目录名
继承
- 子模块通过
parent
元素标识自己的父模块 - 子模块隐式地从父模块继承
groupId
和version
属性 parent.relativePath
元素是相对于子模块POM文件自身的位置
如果子模块与聚合模块的POM同级,则
relativePath
元素应是../pom.xml
或类似的路径。
示例:
parent-module
|
|----sub-module1
| |
| |----pom.xml
|
|----sub-module2
|----pom.xml
项目构建时,Maven会首先根据relativePath
检查父POM,如果找不到,再从本地仓库查找。relativePath
的默认值是../pom.xml
。
可继承POM元素
- groupId
- version
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:创始年份
- url:项目的URL地址
- developers:项目的开发者
- contributors:项目的贡献者
- distributionManagement:部署配置
- issueManagement:缺陷跟踪系统信息
- ciManagement:持续集成系统信息
- scm:版本控制系统信息
- mailingLists:邮件列表信息
- properties:自定义Maven属性
- dependencies:依赖
- dependencyManagement:依赖管理
- repositories:仓库配置
- build:源码目录配置、输出目录配置、插件配置、插件管理配置等
- reporting:报告输出目录配置、报告插件配置等
依赖管理
- 父模块的
dependencyManagement
声明依赖而不实际引入依赖,父子模块的dependencies
元素使用已声明的依赖时可以省略版本号 - 子模块如果通过
dependencies
引入父模块声明的依赖,在引入时可以省略版本号,表示使用父模块中声明的版本 - 通过
import
类型的依赖范围,可以将指定POM的dependencyManagement
合并到当前POM的dependencyManagement
中
示例
<dependencyManagement>
<dependencies>
<dependency>
<groupId>xxx.yyy.zzz</groupId>
<artifactId>aaa-bbb-ccc</artifactId>
<version>m.n.p</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
插件管理
build.pluginManagement
元素用来管理插件,作用同样是声明而不真实引入插件依赖- 好的风格是在父POM中配置通用插件,而在要使用指定插件的子POM中,通过
build.plugings.plugin
元素实际引入,如果是父POM中已经声明的插件,子POM中无需指定版本和配置 - 如果是一些内置的插件,可以只在父POM中声明和配置,而无需再在子POM中引入,就可以对子模块的构建生效,如
maven-compiler-plugin
、maven-resources-plugin
等
超级POM
对于Maven 3而言,超级POM位于$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar
中的org/apache/maven/model/pom-4.0.0.xml
。
超级POM定义了:
- 仓库
- 插件仓库
- 项目的主输出目录
- 主代码输出目录
- 最终构件的名称格式
- 测试代码输出目录
- 主源码目录
- 脚本源码目录
- 测试源码目录
- 主资源目录
- 测试资源目录
- 核心插件的版本号等
反应堆
- 反应堆指所有模块组成的一个构建结构,能够自动计算出合理的模块构建顺序
- 当反应堆中存在循环依赖时就会报错
- 可以使用以下
mvn
命令选项来裁剪反应堆
-pl, --projects <arg> 只构建指定的模块,参数间使用逗号分隔
-am, --also-make 同时构建指定模块的依赖模块
-amd, --also-make-dependencies 同时构建所有依赖于指定模块的模块
-rf, --resume-from <arg> 在完整的反应堆构建顺序基础上,从指定的模块开始构建