Maven实战-第十五篇(Maven中的聚合)

Maven实战-第十五篇(Maven中的聚合)

在实际的项目开发中,我们通常的项目架构都是分模块开发的,也就是一个项目会有多个模块,不同的团队负责开发不同的模块。那么在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项目目录中子目录创建的项目,所以我们不需要指定额外的项目路径。

Maven实战-第十五篇(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为了我们方便管理项目,额外做了很多的工作。

给TA打赏
共{{data.count}}人
人已打赏
Maven

Maven实战-第十四篇(Maven中的插件)

2023-8-5 6:43:54

Maven

Maven实战-第十六篇(Maven中的继承)

2023-8-8 7:01:58