1. maven聚合
1.1 为什么使用聚合?
假设一个项目包含两个模块,我们想要一次构建两个模块,而不是到两个模块的目录下分别执行mvn命令,这时就需要用到聚合。
1.2 聚合配置
-
聚合模块pom配置
- 聚合模块
packaging
类型为pom
- 聚合模块包含
modules
元素,每个module
对应一个要被聚合的子模块。 -
module
的值是当前pom的相对目录。 -
具体配置
<modules> <module>模块1</module> <module>模块2</module> <module>模块3</module> </modules>
- 聚合模块
-
聚合模块相对位置
- 通常将聚合模块放在项目目录的最顶层,其他模块作为聚合模块的子目录。
-
聚合模块意义
- 聚合模块仅仅是帮助聚合其他模块构建的工具,本身并无实质内容。
- 解决同时构建多个模块的问题。
-
聚合模块构建
- maven首先会解析聚合模块的pom,分析要构建的模块,并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次构建各个模块。
2. maven继承
2.1 为什么使用继承?
解决重复配置问题。
2.2 继承配置
-
项目继承的配置
- 父模块的
packaging
类型为pom
。 -
子模块需要配置
project -> parent
元素信息- 父模块坐标配置,groupId:artifactId:version
-
relativePath
: 父模块pom文件所在路径,默认父pom在上一层目录下(即../pom.xml
)。 - 构建过程中,maven会根据relativePath检查父pom,如果找不到,再从本地仓库查找。
-
子模块继承父模块的配置
<parent> <groupId>父构件groupId</groupId> <artifactId>父构件artifactId</artifactId> <version>父构件的版本号</version> <relativePath>父构件pom.xml路径</relativePath> </parent>
- 父模块的
-
可继承的pom元素
- groupId:项目组ID,项目坐标的核心元素。
- version:项目版本,项目坐标的核心元素。
- description:项目的描述信息。
- organization:项目的组织信息。
- inceptionYear:项目的创始年份。
- url:项目的url地址。
- developers:项目的开发者信息。
- contributors:项目的贡献者信息。
- distributionManagement:项目的部署配置信息。
- issueManagement:项目的缺陷跟踪系统信息。
- ciManagement:项目的持续集成系统信息。
- scm:项目的版本控制系统信息。
- mailingLists:项目的邮件列表信息。
- properties:自定义的maven属性配置信息。
- dependencyManagement:项目的依赖管理配置。
- repositories:项目的仓库配置。
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等信息。
- reporting:包括项目的报告输出目录配置、报告插件配置等信息。
-
依赖管理
- maven提供的
dependencyManagement
元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性. - 在
dependencyManagement
元素下的依赖声明不会引入实际的依赖
,但是它能约束对dependencies
下的依赖使用。 -
import
依赖范围:- 将目标pom中
dependencyManagement
配置导入,并合并到当前项目的dependencyManagement
元素中。 - 不想使用继承的方式,来达到使用目标pom中的依赖的目的。
-
import依赖范围一般都指向打包类型为pom的模块。
<dependencyManagement> <dependencies> <dependency> <groupId>targetGroupId</groupId> <artifactId>targetArtifactId</artifactId> <version>targetVersion</version> <type>pom</type> <scope>import</scope> </dependency> <dependency>构件1</dependency> <dependency>构件2</dependency> </dependencies> </dependencyManagement>
- 将目标pom中
- maven提供的
-
插件管理
- maven中提供了dependencyManagement来帮助管理依赖继承,也提供了
pluginManagement
元素帮助管理插件继承。 - 在父模块pom中该元素的配置不会造成实际的插件调用行为,只有在子pom.xml中配置
plugins -> plugin
元素声明该插件的时候,插件才会起效。 - 子pom插件中只需要写
groupId、artifactId
,其他信息都可以从父pom中传递过来。 -
举例,使用maven-source-plugin插件生成项目源码包,将该插件的jar-no-fork目标绑定到default生命周期的verify阶段。
-
父pom插件管理配置
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
-
子pom插件声明配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> </plugin> </plugins> </build>
-
- maven中提供了dependencyManagement来帮助管理依赖继承,也提供了
3. 聚合与继承
-
目的
- 聚合主要是为了方便快速构建多模块项目。
- 继承主要是为了消除重复配置。
-
与其他模块关系
- 对于聚合模块来说,聚合模块知道有哪些被聚合的模块,而被聚合模块不知道聚合模块的存在。
- 对于继承来说,父模块是不知道有哪些子模块继承它,而子模块需要使用
parent
来引用父模块。
-
共同点
- 聚合模块和继承中的父模块的packaging属性都必须是pom类型的。
- 同时,聚合模块和父模块除了pom.xml,一般都没有实际内容。
-
实际使用
- 将聚合和继承一起使用,能同时使用到两者的优点。
4. 反应堆
4.1 介绍
-
反应堆
- 在多模块的maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。
-
单模块项目的反应堆
- 就是该模块本身。
-
多模块项目的反应堆
- 包含模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。
4.2 反应堆构建顺序
- maven按聚合配置中的顺序读取pom。
- 如果该pom没有依赖模块,那么就构建该模块,否则就先构建其依赖的模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。
4.3 裁剪反应堆
-
说明
- 一般情况下,用户会选择构建整个项目或者选择构建单个模块。
- 如果想要仅仅构建完整反应堆中的某些模块,就需要实时的裁剪反应堆
-
裁剪反应堆选项
- 执行
mvn -h
可以看到裁剪反应堆的选项。 -
-am
:--also-make, 同时构建所列模块的依赖模块。 -
-amd
:-also-make-dependencies,同时构建依赖于所列模块的模块。 -
-pl
:--projects <arg>,构建指定的模块,模块之间使用逗号分隔 -
-rf
:-resume-from <arg>,从指定的模块继续反应堆
- 执行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。