⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7359083767564238863 「豆豆豆豆变」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

以下面的这个maven项目为例

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

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

反应堆

如果想把他们安装到本地仓库,需要在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命令,打印结果如下:

上面过程给大家捋一捋:

1.上面命令先会运行-pl b2b-account-api得到一个反应堆列表,如下,只有一个模块:

b2b-account-api

2.然后后面又会执行amd,这个命令会找到对-pl b2b-account-api有依赖的构件,也就是:

b2b-account-service
b2b-order-serivce

3.然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:

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

4.然后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

1.上面命令先会运行-pl b2b-order-service得到一个反应堆列表:

b2b-order-service

2.然后后面又会执行am,这个命令会找到-pl b2b-order-service依赖的构件,也就是:

b2b-account-api
b2b-order-api

3.然后反应堆会对3个构件进行排序,得到一个正确的构件顺序,如下:

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

4.然后maven会依次对他们执行:

mvn clean install
文章目录
  1. 1. 反应堆
  2. 2. 按需随意构建
    1. 2.0.1. -pl <arg>
    2. 2.0.2. -rf <arg>
    3. 2.0.3. -amd
    4. 2.0.4. -am