04.maven多模块任意构建,必备神技能

1,949 阅读6分钟

本文中使用的maven的demo已经上传到#Gitee中,特此说明!

以下面的这个maven项目为例

image.png

注意:上面项目的结构属于父子结构,使用maven中聚合的方式进行管理的:

  • b2b中包含了2个子模块b2b_accountb2b_order,这3个package都是pom
  • b2b_account中包含了2个子模块,2个子模块的package是默认的jar类型
  • b2b_order中包含了2个子模块,2个子模块的package是默认的jar类型

这个项目已经上传到#Gitee中了。

反应堆

如果想把他们安装到本地仓库,需要在b2b/pom.xml所在目录执行下面命令:

mvn clean install

maven会根据模块之间的依赖关系,然后会得到所有模块的构建顺序,共有7个pom.xml文件,也就是7个maven构件会进行构建。

可以看到b2b-account-api是被其他一些模块依赖的,所以这个放在了第一个。

mvn命令对多模块构件时,会根据模块的依赖关系而得到模块的构建顺序,这个功能就是maven的反应堆(reactor)做的事情,反应堆会根据模块之间的依赖关系、聚合关系、继承关系等等,从而计算得出一个合理的模块构建顺序

按需随意构建

有这样的一种场景:b2b-account-apib2b-account-serviceb2b-order-service依赖了,所以当b2b-account-api有修改的时候,我们希望他们3个都能够被重新构建一次,而不是去对所有的模块都进行重新构建,我们只希望被影响的模块都能够参与重新构建,大家有什么好的办法?

上面列出的只是2个模块的功能,真正的电商项目还有很多模块,如果每次修改一个模块,我们都去重新打包所有的模块,这个构建过程耗时是非常久的,只能干等着,我们需要的是按需构建,需要构建哪些模块让我们自己能够随意指定,这样也可以加快构建的速度,所以我们需要这样的功能

maven反应堆帮我们考虑到了这种情况,mvn命令提供了一些功能可以帮我们实现这些操作,mvn -h可以查看帮助。列出一些常用的命令参数:

-pl <arg>

等价于--projects <arg>

构件指定的模块,arg表示多个模块,之间用逗号分开,模块有两种写法

-pl 模块1相对路径 [,模块2相对路径] [,模块n相对路径]
-pl [模块1的groupId]:模块1的artifactId [,[模块2的groupId]:模块2的artifactId] [,[模块n的groupId]:模块n的artifactId]

举例:

下面命令都是在b2b/pom.xml来运行

只构建`p-account`模块
mvn clean install -pl b2b-account

只构建b2b-account-api模块
mvn clean install -pl b2b-account/b2b-account-api

构建b2b-account-api和b2b-account-service模块
mvn clean install -pl b2b-account/b2b-account-api,b2b-account/b2b-account-service

构建b2b-account-api和b2b-order-api
mvn clean install -pl :b2b-account-api,b2b-order/b2b-order-api
mvn clean install -pl :b2b-account-api,:b2b-order-service

-rf <arg>

等价于--resume-from <arg>,从指定的模块恢复反应堆

分别执行下面2条mvn命令,先看一下效果:

mvn clean install
mvn clean install -rf b2b-order/b2b-order-service

输出中我们取出部分内容,如下。

第一条命令,反应堆产生的构建顺序是:

[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api                                                    [jar]
[INFO] b2b-account-service                                                [jar]
[INFO] b2b-account                                                        [pom]
[INFO] b2b-order-api                                                      [jar]
[INFO] b2b-order-service                                                  [jar]
[INFO] b2b-order                                                          [pom]
[INFO] b2b                                                                [pom]

第2条命令,反应堆产生的构建顺序是:

[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-order-service                                                  [jar]
[INFO] b2b-order                                                          [pom]
[INFO] b2b                                                                [pom]

在仔细看一下上面2条命令的差别,后面的命令多了-rf b2b-order/b2b-order-service,具体过程如下:

会先执行下面命令

mvn clean install

反应堆会计算出需要构件的模块顺序,如下:

[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api                                                    [jar]
[INFO] b2b-account-service                                                [jar]
[INFO] b2b-account                                                        [pom]
[INFO] b2b-order-api                                                      [jar]
[INFO] b2b-order-service                                                  [jar]
[INFO] b2b-order                                                          [pom]
[INFO] b2b                                                                [pom]

-rf b2b-order/b2b-order-service对上面的反应堆构件顺序进行裁剪,将b2b-order/b2b-order-service前面的部分干掉,从b2b-order/b2b-order-service开始执行构建操作,所以剩下了3个需要构建的模块。

-amd

等价于--also-make-dependents,同时构件依赖于所列模块x的模块,就是哪些模块依赖x模块,顺便一起构建了

构建b2b-account-api,然后哪些模块依赖b2b-account-api模块,顺便一起构建了
mvn clean install -pl b2b-account/b2b-account-api -amd

mvn clean install -pl b2b-account/b2b-account-api这个是只构建b2b-account-api模块,后面加上个-amd就是构建那些依赖b2b-account-api的模块

那么在上面的项目中,有 b2b-account-serviceb2b-order-service这两个模块依赖于b2b-account-api,所以这两个模块也会被构建

执行玩上述的mvn命令,打印结果如下:

image.png

上面过程给大家捋一捋:

  1. 上面命令先会运行-pl b2b-account-api得到一个反应堆列表,如下,只有一个模块:
b2b-account-api
  1. 然后后面又会执行amd,这个命令会找到对-pl b2b-account-api有依赖的构件,也就是:
b2b-account-service
b2b-order-serivce
  1. 然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:
[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api                                                    [jar]
[INFO] b2b-account-service                                                [jar]
[INFO] b2b-order-service                                                  [jar]
  1. 然后maven会依次对他们执行:
mvn clean install

-am

等价于--also-make,同时构建所列模块x的依赖模块,就是x依赖哪些模块,顺便一起构建了

需求:我们来构建b2b-order-service,希望b2b-order-service依赖的构件也能被同时构建,b2b-order-service依赖于b2b-account-apib2b-order-api,可能b2b-order-service会依赖的更多。

可以使用下面命令:

mvn clean install -pl b2b-order/b2b-order-service -am
  1. 上面命令先会运行-pl b2b-order-service得到一个反应堆列表:
b2b-order-service
  1. 然后后面又会执行am,这个命令会找到-pl b2b-order-service依赖的构件,也就是:
b2b-account-api
b2b-order-api
  1. 然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:
[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api                                                    [jar]
[INFO] b2b-order-api                                                      [jar]
[INFO] b2b-order-service                                                  [jar]
  1. 然后maven会依次对他们执行:
mvn clean install

本文参考:www.itsoku.com/course/2/69