Maven--聚合
如果想要一次构建多个项目,而又不想分别进入到所有项目的目录下分别执行 mvn 命令。就可以使用 Maven 的聚合(或者称为多模块)特性。
假设有两个模块 T-A 和 T-B,我们想要一次构建两个项目则需要创建一个额外的模块。这里创建一个名为 T-aggregator 的模块,然后通过 T-aggregator 模块构建整个项目的所有模块。T-aggregator 本身作为一个 Maven 项目,它必须要有自己的 POM,不过,同时作为一个聚合项目,其 POM 又有特殊的地方。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>org.wzh.maven</groupId> 6 <artifactId>T-aggregator</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>pom</packaging> 9 <name>T-aggregator</name> 10 <modules> 11 <module>T-A</module> 12 <module>T-B</module> 13 </modules> 14 15 16 </project>
上述 POM 为 T-aggregator 的 POM 文件,该 POM 文件和其他两个模块的版本、groupId 一致,Maven 并没有强制要求它们一致,最好的做法是使它们保持一致。且模块所处的目录名称也应该与 artifactId 一致,这是为了方便快速定位内容,Maven 同样没有强制要求。
<module> :值是一个当前 POM 的相对目录。
<packaging> :对于聚合模块来说,其打包方式的值必须为 pom,否则无法构建。
为了方便用户构建项目,通常将聚合模块放在项目目录的顶层,其他模块则作为聚合模块的子目录存在,这样当用户得到源码的时候,第一眼发现的就是聚合模块的 POM,不用从多个模块中去寻找聚合模块来构建整个项目。
聚合模块仅仅是帮助聚合其他模块构建的工具,它本身并无实质内容,所以这里 T-aggregator 内容仅仅是一个 pom.xml 文件。
如果使用平行目录结构,聚合模块的 POM 也需要做相应的修改。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>org.wzh.maven</groupId> 6 <artifactId>T-aggregator</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>pom</packaging> 9 <name>T-aggregator</name> 10 <modules> 11 <module>../T-A</module> 12 <module>../T-B</module> 13 </modules> 14 15 16 </project>
Maven 会首先解析聚合模块的 POM、分析要构建的模块、并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。
构建的最终输出显示的是各模块的名称,而不是 artifactId,所以在 POM 中需配置合理的 <name> 值,其目的是让 Maven 的构建输出更清晰。