Maven实战-第十九篇(Maven多模块构建)

Maven实战-第十九篇(Maven多模块构建)

一、多模块构建顺序

在Maven聚合那篇文章中我们介绍了可以通过父模块来管理子模块,并且我们也介绍了,如果项目是多模块构建的,在构建的时候, 是有默认构建顺序的。例如一个项目中有三个模块分别为:A、B、C。期中A依赖于项目B。那我们在父项目中执行构建命令时,Maven并不会按照我们声明的顺序构建执行,而是按照项目的依赖顺序构建的。也就是上面说的A依赖B,所以不管我们项目中如何配置顺序,Maven在构建的顺序一定是先构建B,然后在构建A。而至于模块C由于没有任何依赖,所以此项目将按照我们pom.xml中配置的顺序进行构建。这也是Maven执行构建的规则。

二、指定模块构建

在实际的项目开发中,由于不同的模块承担的角色不同,可能需要单独打包部署,或者需要我们构建指定的模块进行打包,那应该如何做呢?有一种办法非常的简单,例如我们只要单独执行这个子模块的pom.xml就可以了。但是如果我们这个项目的模块比较多。我们就需要进入到每一个子模块中去构建我们的项目。并且在实际的项目中,项目的构建都是通过构建软件执行的,例如:jenkins等。并且通常一个项目,都会配置一个构建脚本。如果我们想指定构建不同的子模块,则需要在编写相应的脚本来支持,也就是通过不同子模块的pom.xml进行打包。虽然按照上面的方式,可以实现构建不同子模块打包的目的,但是操作起来则比较麻烦。 Maven为了方便我们实现上面的功能提供了裁剪的功能也就是对我们这一个整个项目进行裁剪,裁剪后的项目,就可以理解为我们想要打包的子模块。这样就可以很方便的构建我们指定的模块了,并且这种方式可以提高项目打包的效率,虽然我们是在父项目中执行的项目构建,但是因为裁剪,实际上执行的,就是我们指定的子模块的打包。为了支持不同种场景裁剪,所以Maven会按照以下的规则实现上述的功能,下面我们详细介绍一下。

  • -pl,——projects<arg>构建指定的模块,模块间用逗号分隔

这是什么意思呢?别着急我们通过下面的例子来演示一下,我们还是以midai-mazhe-maven项目为例子,它是父项目包括以下3个子模块,分别为mazhe-maven-mall、mazhe-maven-order、mazhe-maven-user。其中项目mazhe-maven-user依赖于项目mazhe-maven-order。下面是项目pom.xml配置。

  • pom.xml(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-mall</module>
        <module>mazhe-maven-order</module>
    </modules>
</project>
  • pom.xml(mazhe-maven-mall)
<?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-mall</artifactId>

</project>
  • pom.xml(mazhe-maven-order)
<?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-order</artifactId>
</project>
  • pom.xml(mazhe-maven-user)
<?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 install命令,Maven会按照我们父项目中所有配置的子模块开始构建,但当我们指定-pl参数时,Maven则只会按照我们配置的子模块名字进行构建,多个子模块用逗号分割。具体命令如下:

  • 命令
mvn clean install -pl mazhe-maven-mall,mazhe-maven-order
  • 日志
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for mazhe-maven-order 1.0-SNAPSHOT:
[INFO] 
[INFO] mazhe-maven-order .................................. SUCCESS [  2.350 s]
[INFO] mazhe-maven-mall ................................... SUCCESS [  0.133 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

看上面的日志输出,通过-pl参数设置,我们在执行编译时,项目就只会按照我们设置的模块进行构建了,这也就是裁剪的作用。


  • -am,——also-make同时构建所列模块的依赖模块

下面我们还是通过-pl参数设置,只是这次我们构建的项目是mazhe-maven-usermazhe-maven-mall,具体命令如下。

  • 命令
mvn clean install -pl mazhe-maven-user,mazhe-maven-mall
  • 日志
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for mazhe-maven-user 1.0-SNAPSHOT:
[INFO] 
[INFO] mazhe-maven-user ................................... FAILURE [  0.286 s]
[INFO] mazhe-maven-mall ................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.410 s
[INFO] Finished at: 2023-08-14T06:33:48+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project mazhe-maven-user: Could not resolve dependencies for project cn.ma-zhe:mazhe-maven-user:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: cn.ma-zhe:mazhe-maven-order:jar:1.0-SNAPSHOT (absent): Could not find artifact cn.ma-zhe:mazhe-maven-order:jar:1.0-SNAPSHOT -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

我们看这次执行的命令虽然和上面的是一样的,但是由于我们构建的项目不同,构建日志居然报错了,那么为什么会报错呢?这是因为我们项目中有依赖,因为项目mazhe-maven-user依赖于项目mazhe-maven-order。所以上面的日志报错了。但是如果我们每次执行时候,都需要考虑项目的依赖顺序,那么太麻烦了。所以Maven为了方便我们执行裁剪,提供了-am参数,当指定了该参数后,Maven会自动将我们指定构建的模块的依赖模块也一同构建。下面我们试一下,具体命令如下:

  • 命令
mvn clean install -pl mazhe-maven-user,mazhe-maven-mall -am
  • 日志
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for midai-mazhe-maven 1.0-SNAPSHOT:
[INFO] 
[INFO] midai-mazhe-maven .................................. SUCCESS [  0.461 s]
[INFO] mazhe-maven-order .................................. SUCCESS [  1.956 s]
[INFO] mazhe-maven-user ................................... SUCCESS [  0.144 s]
[INFO] mazhe-maven-mall ................................... SUCCESS [  0.113 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

这样我们就解决了项目打包依赖顺序的问题了。

  • -amd-also-make-dependents同时构建依赖于所列模块的模块

下面我们介绍一下-amd参数,-amd参数和am的区别是,后者会在构建的时候,自动将依赖的模块进行构建。而前者的作用则是,在构建的时候,自动构建依赖于这个模块的模块。

  • 命令
mvn clean install -pl mazhe-maven-order -amd
  • 日志
[INFO] Reactor Summary for mazhe-maven-order 1.0-SNAPSHOT:
[INFO] 
[INFO] mazhe-maven-order .................................. SUCCESS [  2.369 s]
[INFO] mazhe-maven-user ................................... SUCCESS [  0.123 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

我们看上面的日志输出,我们知道项目mazhe-maven-user依赖于项目mazhe-maven-order。所以通过-amd参数编译时,Maven会将依赖这个模块的其它模块一同构建,所以上面会有项目mazhe-maven-user的构建信息,这就是参数-amd-am的区别。

  • -rf-resume-from<arg>从指定的模块回复反应堆

下面我们在介绍一下最后的参数-rf。通过该参数我们可以在构建的顺序中继续进行裁剪,也就是按照我们指定的顺序裁剪,之前的则会省略。例如我们先执行下面的命令。

  • 命令
mvn clean install
  • 日志
[INFO] midai-mazhe-maven .................................. SUCCESS [  0.446 s]
[INFO] mazhe-maven-order .................................. SUCCESS [  1.854 s]
[INFO] mazhe-maven-user ................................... SUCCESS [  0.140 s]
[INFO] mazhe-maven-mall ................................... SUCCESS [  0.150 s]

我们我们添加一下-rf参数,在看一下输出的日志。

  • 命令
mvn clean install -rf mazhe-maven-mall
  • 日志
[INFO] Installing /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-1.0-SNAPSHOT.jar to /Users/md/.m2/repository/cn/ma-zhe/mazhe-maven-mall/1.0-SNAPSHOT/mazhe-maven-mall-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.518 s
[INFO] Finished at: 2023-08-14T07:10:12+08:00
[INFO] ------------------------------------------------------------------------

看上面的日志信息,按照打包的顺序,我们指定了 mazhe-maven-mall项目,并且因为该项目是最后一个项目,所以通过上面的命令打包,Maven只会编译这一个项目,而其它的项目则会忽略。

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

Maven实战-第十八篇(Maven中的默认约定)

2023-8-13 7:22:42

Maven

Maven实战-第二十篇(Nexus创建私服)

2023-8-15 7:05:30