本文中使用的maven的demo已经上传到#Gitee中,特此说明!
以下面的这个maven项目为例
注意:上面项目的结构属于父子结构,使用maven中聚合的方式进行管理的:
- b2b中包含了2个子模块
b2b_account
和b2b_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-api
被b2b-account-service
和b2b-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-service
和b2b-order-service
这两个模块依赖于b2b-account-api
,所以这两个模块也会被构建
执行玩上述的mvn命令,打印结果如下:
上面过程给大家捋一捋:
- 上面命令先会运行
-pl b2b-account-api
得到一个反应堆列表,如下,只有一个模块:
b2b-account-api
- 然后后面又会执行
amd
,这个命令会找到对-pl b2b-account-api
有依赖的构件,也就是:
b2b-account-service
b2b-order-serivce
- 然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:
[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api [jar]
[INFO] b2b-account-service [jar]
[INFO] b2b-order-service [jar]
- 然后maven会依次对他们执行:
mvn clean install
-am
等价于--also-make
,同时构建所列模块x的依赖模块,就是x依赖哪些模块,顺便一起构建了
需求:我们来构建b2b-order-service,希望b2b-order-service依赖的构件也能被同时构建,b2b-order-service依赖于b2b-account-api
和b2b-order-api
,可能b2b-order-service会依赖的更多。
可以使用下面命令:
mvn clean install -pl b2b-order/b2b-order-service -am
- 上面命令先会运行
-pl b2b-order-service
得到一个反应堆列表:
b2b-order-service
- 然后后面又会执行
am
,这个命令会找到-pl b2b-order-service
依赖的构件,也就是:
b2b-account-api
b2b-order-api
- 然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:
[INFO] Reactor Build Order:
[INFO]
[INFO] b2b-account-api [jar]
[INFO] b2b-order-api [jar]
[INFO] b2b-order-service [jar]
- 然后maven会依次对他们执行:
mvn clean install