maven 反应堆(reactor)

《maven实战》 学习笔记

在一个多模块的Maven项目中,反应堆(Reactor )是指所有模块组成的一个构建结构
对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序

反应堆的构建顺序

为了能更清楚地解释反应堆的构 建顺序,将account-aggregator 的聚合配置修改如下:

 <modules>
      <module>account-email</module>
      <module>account-persist</module>
      <module>account-parent</module>
  </modules>

account-email extends account-parent
account-persist extends account-parent

修改完毕之后构建account-aggregator 会看到如下的输出:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-parent                                                     [pom]
[INFO] account-email                                                      [jar]
[INFO] account-persist                                                    [jar]
[INFO] account-aggregator                                                 [pom]
[INFO] 

如果按顺序读取POM 文件,首先应该读到 的是account-asgregator 的POM,实际情况与预料的 一致
可是接下来几个模块的构建次序 录然与它们在聚合模块中的声明顺序不一致,account- parent 跑到了account-email 前面,这 是为什么呢?为了解释这 一现象:
在这里插入图片描述
从上至下的箭头表示POM 的读取次序,但这不足以决定反应堆的构建顺序, Maven 还需要考虑模块之问的继承和依赖关系,因中的有向虚连接线表示模块之问的继承或者依赖.
该例中accounl-email和account-persist依赖于account-parent. 那么account-parent 就必须先于另外两个模块 构建。

这里还有一个从右向左的箭头实际的构建顺序是这样形成的:

  • Maven 按序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块.
  • 如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。

该例中,

  • account-aggregator 没有依赖模块,因此先构建它,
  • 接着到account-email ,它依赖于aecount- parent 模块,必须先构建account- parent ,
  • 然后再构建account-email,
  • 最后到account- persist 的时候.由于其依赖模块巳经被构建,因此直接构建它。

模块间的依赖关系会将反应堆构成一个有向非循环图(Direeted AcyelicGraph, DAG), 各个模块是该图的节点,依赖关系构成了有向边。这个图不允许出现循环,因此, 当出现 模块 A依赖于B,而B依赖于A的情况时,Maven 就会报错。

裁剪反应堆

裁剪反应堆 一般来说,用户会选择构建整个项目或者选择构建单个模块
但有些时候,用户会想 要仅仅构建完整反应堆中的某些个模块。换句话说,用户需要实时地裁剪反应堆。
Maven 提供很多的命令行选项支持裁剪反应堆,输人mvn -h 可以看到这些选项:

  • -am,–also-make 同时构建所列模块的依赖模块**(找祖宗)**
  • -amd,–also-make-dependents 同时构建依赖于所列模块的模块**(找后代)**
  • -pl --project <arg> 构建指定的模块,模块间用逗号分隔
  • -rf -resume-from <arg>指定的模块恢复反应堆

mvn clean install -pl account-email,account-persist

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-email                                                      [jar]
[INFO] account-persist                                                    [jar]
[INFO] 

mvn clean install -pl account-email -am
由于account-email 依赖于account- parent ,因此会得到如下反应堆:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-parent                                                     [pom]
[INFO] account-email                                                      [jar]

使用-amd 选项可以同时构建依赖于所列模块的模块。
**mvn clean install -pl account-parent -amd **

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-parent                                                     [pom]
[INFO] account-email                                                      [jar]
[INFO] account-persist                                                    [jar]

使用- 叶选项可以在完整的反应堆构建顺序基础上指定从哪个模块开始构建
mvn clean install -rf account-email
例如:完整的反应堆构建顺序中,account-email 位于第三,它之后只有account- persist ,
因此 会得到如 下的裁剪反应堆:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-email                                                      [jar]
[INFO] account-persist                                                    [jar]
[INFO] account-aggregator                                                 [pom]

最后,在**- pl - am 或者- pl - amd** 的基础 上,还能应用-rf 参数,以对裁剪后的反应堆再次裁剪
mvn clean install -pl account-parent -amd -rf account-email

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] account-email                                                      [jar]
[INFO] account-persist                                                    [jar]

在开发过程中,灵活应用上述4 个参数.可以帮助我们跳过无须构建的模块,从而加 速构建。在项目龙大、模块特别生的时候,这种效果就会异常明显.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值