在实际的项目开发中,我们通常的项目架构都是分模块开发的,也就是一个项目会有多个模块,不同的团队负责开发不同的模块。那么在Maven中怎么能控制多个模块的构建呢?如果每个模块都需要单独的管理的话,那么如果模块比较多的话,是一个不小的工作量。所以Maven为了方便我们管理项目的,在Maven中我们可以创建另外的一个项目来控制其它模块的构建,并且每一个模块都有自己独立的pom文件。这个控制其他模块的构建的项目也就是Maven中的聚合项目。但它的配置和其它模块的配置稍有不同,聚合项目也可以称之为父项目。实际上在之前的内容中我们已经使用了聚合项目的配置,也就是midai-mazhe-maven
项目中我们使用过的。只不过之前我们并没有详细介绍,今天我们详细介绍的一下聚合项目的配置。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ma-zhe</groupId>
<artifactId>midai-mazhe-maven</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mazhe-maven-user</module>
<module>mazhe-maven-order</module>
<module>mazhe-maven-mall</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
上面的配置和正常的项目构建大体上没有任何区别,唯一的区别是packaging
标签。我们知道该标签的作用是设置Maven打包的类型,并且默认为jar。但当我们需要通过此项目来管理其它项目时,需要将此参数设置为pom类型。现在我们已经介绍了三种packaging
类型的标签了,也就是jar、maven-plugin、pom
。除了上述的不同之外,还要需要设置module
标签。module
标签用来配置我们需要管理的其它模块的项目名称,也就是其它模块artifactId
标签指定的模块名称。上面的配置是在midai-mazhe-maven
项目目录中子目录创建的项目,所以我们不需要指定额外的项目路径。
当然我们也可以配置module
标签为相对路径以及绝对路径。这样不用必须在子目录中管理项目。下面我们执行一下清理命令,来验证一下,通过这样的配置,Maven会不会管理我们的子项目。
- 命令
mvn clean
- 执行日志:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] midai-mazhe-maven [pom]
[INFO] mazhe-maven-user [jar]
[INFO] mazhe-maven-order [jar]
[INFO] mazhe-maven-mall [jar]
[INFO]
[INFO] --------------------< cn.ma-zhe:midai-mazhe-maven >---------------------
[INFO] Building midai-mazhe-maven 1.0-SNAPSHOT [1/4]
[INFO] from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ midai-mazhe-maven ---
[INFO]
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-user >---------------------
[INFO] Building mazhe-maven-user 1.0-SNAPSHOT [2/4]
[INFO] from mazhe-maven-user/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-user ---
[INFO]
[INFO] --------------------< cn.ma-zhe:mazhe-maven-order >---------------------
[INFO] Building mazhe-maven-order 1.0-SNAPSHOT [3/4]
[INFO] from mazhe-maven-order/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-order ---
[INFO]
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT [4/4]
[INFO] from mazhe-maven-mall/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-mall ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for midai-mazhe-maven 1.0-SNAPSHOT:
[INFO]
[INFO] midai-mazhe-maven .................................. SUCCESS [ 0.293 s]
[INFO] mazhe-maven-user ................................... SUCCESS [ 0.003 s]
[INFO] mazhe-maven-order .................................. SUCCESS [ 0.002 s]
[INFO] mazhe-maven-mall ................................... SUCCESS [ 0.003 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.434 s
[INFO] Finished at: 2023-08-07T06:19:39+08:00
[INFO] ------------------------------------------------------------------------
看上面日志Maven成功的执行了项目的清理,并且除了父项目外,还执行了子项目的清理工作,并且是按照我们在父项目中的执行的顺序执行的清理动作。下面我们修改一下配置,让mazhe-maven-user
项目依赖于mazhe-maven-order
项目,然后在看一下日志输出有何不同。下面为mazhe-maven-user
项目的pom配置。
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>midai-mazhe-maven</artifactId>
<groupId>cn.ma-zhe</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mazhe-maven-user</artifactId>
<dependencies>
<dependency>
<groupId>cn.ma-zhe</groupId>
<artifactId>mazhe-maven-order</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
我们再次执行父项目的清理命令来看一下日志输出有何不同。
- 命令
mvn clean
- 日志
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] midai-mazhe-maven [pom]
[INFO] mazhe-maven-order [jar]
[INFO] mazhe-maven-user [jar]
[INFO] mazhe-maven-mall [jar]
[INFO]
[INFO] --------------------< cn.ma-zhe:midai-mazhe-maven >---------------------
[INFO] Building midai-mazhe-maven 1.0-SNAPSHOT [1/4]
[INFO] from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ midai-mazhe-maven ---
[INFO]
[INFO] --------------------< cn.ma-zhe:mazhe-maven-order >---------------------
[INFO] Building mazhe-maven-order 1.0-SNAPSHOT [2/4]
[INFO] from mazhe-maven-order/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-order ---
[INFO]
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-user >---------------------
[INFO] Building mazhe-maven-user 1.0-SNAPSHOT [3/4]
[INFO] from mazhe-maven-user/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-user ---
[INFO]
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT [4/4]
[INFO] from mazhe-maven-mall/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-mall ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for midai-mazhe-maven 1.0-SNAPSHOT:
[INFO]
[INFO] midai-mazhe-maven .................................. SUCCESS [ 0.298 s]
[INFO] mazhe-maven-order .................................. SUCCESS [ 0.003 s]
[INFO] mazhe-maven-user ................................... SUCCESS [ 0.003 s]
[INFO] mazhe-maven-mall ................................... SUCCESS [ 0.002 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.440 s
[INFO] Finished at: 2023-08-07T06:29:47+08:00
[INFO] ------------------------------------------------------------------------
我们通过上面的日志观察到项目mazhe-maven-order
和项目mazhe-maven-user
的执行顺序发生了变化,已经不是我们父项目中配置的那个顺序了。这是为什么呢?实际上Maven在通过父项目管理项目时,如果模块彼此之间,没有任何依赖,则会按照父项目中配置的顺序执行。但如果模块之间有依赖,则会先按照依赖的顺序执行。这样做的目的是,如果两个模块有依赖,例如上面的项目mazhe-maven-user
依赖项目mazhe-maven-order
。如果Maven不按照依赖的顺序处理的话,在执行的时候,项目mazhe-maven-user
则会报错,应该它找不到项目mazhe-maven-order
。因为项目mazhe-maven-order
还没有执行,这样只能我们手动的配置。这样我们在配置时必须考虑每个模块彼此的依赖关系,这样就会增加我们通过父模块来方便快捷管理模块初衷了,这也间接的证明了,Maven为了我们方便管理项目,额外做了很多的工作。