《maven实战》 学习笔记
在一个多模块的Maven项目中,反应堆(Reactor )是指所有模块组成的一个构建结构。
对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。
为了能更清楚地解释反应堆的构 建顺序,将account-aggregator 的聚合配置修改如下:
<modules>
<module>account-emailmodule>
<module>account-persistmodule>
<module>account-parentmodule>
modules>
account-email
extendsaccount-parent
account-persist
extendsaccount-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 就必须先于另外两个模块 构建。
这里还有一个从右向左的箭头。实际的构建顺序是这样形成的:
该例中,
模块间的依赖关系会将反应堆构成一个有向非循环图(Direeted AcyelicGraph, DAG), 各个模块是该图的节点,依赖关系构成了有向边。
这个图不允许出现循环
,因此, 当出现 模块 A依赖于B,而B依赖于A的情况时,Maven 就会报错。
裁剪反应堆 一般来说,用户会选择构建整个项目或者选择构建单个模块,
但有些时候,用户会想 要仅仅构建完整反应堆中的某些个模块。换句话说,用户需要实时地裁剪反应堆。
Maven 提供很多的命令行选项支持裁剪反应堆,输人mvn -h
可以看到这些选项:
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 个参数.可以帮助我们跳过无须构建的模块,从而加 速构建。在项目龙大、模块特别生的时候,这种效果就会异常明显.