对于一个maven项目,若是有多个模块,那么它们的执行顺序是什么样的呢?javascript
在执行mvn操做的时候,你能够看到以下信息,这个即是maven的build顺序java
那么maven是如何决定顺序的呢?以下:react
在多模块Maven项目中,反应堆(Reactor)是一个包含了全部须要构建模块的抽象概念,对于Maven用户来讲,主要关心的是两点:api
在默认状况下,Maven会根据多模块配置构建全部的模块,Maven还会根据模块间的依赖关系自动计算构建顺序,以确保被依赖的模块会先得以构建。值得一提的是,在这种情形下,Maven会将父模块当作是其子模块的依赖。app
在多模块Maven项目中,反应堆(Reactor)是一个包含了全部须要构建模块的抽象概念,对于Maven用户来讲,主要关心的是两点:maven
例若有这样的一个多模块项目:ui
plexus-security包含了8个子模块,其中security-realms还包括了更进一层的两个子模块。spa
运行mvn clean install能够看到这样的输出:命令行
Java代码 rest
在默认状况下,Maven会根据多模块配置构建全部的模块,Maven还会根据模块间的依赖关系自动计算构建顺序,以确保被依赖的模块会先得以构建。值得一提的是,在这种情形下,Maven会将父模块当作是其子模块的依赖,所以该例中Security Parent会较先得以构建。
通常来讲,咱们要么构建整个项目,要么构建单个模块,可是有些时候,咱们会想要仅仅构建这个完整的反应堆中的某些模块,换句话说,咱们会须要裁剪反应堆。
例如说,我对模块security-configuration作了一些更改,而我知道在完整反应堆顺序中,security-model-xml和security-model在其以前,不会依赖它,所以就不必构建他们。咱们只须要构建security-configuration及其以后的项目。
Maven提供了不少命令行选项让咱们自定义反应堆,输入mvn -h能够看到这样一些选项:
Java代码
--resume-from 表示从该模块恢复,也就是说选择从哪里开始构建,等于剪掉了完整反应堆的前面一部分。
例如我运行 mvn clean install -rf security-configuration/ ,就会获得这样的一个反应堆:
Java代码
与完整反应堆相比,前面的四个模块不见了,只保留了security-system及其以后的模块。
--projects 表示手动选择须要构建的项目,项目间以逗号分隔。
例如我运行 mvn clean install -pl security-configuration/,security-realms/security-xml-realm/,会获得以下反应堆:
Java代码
--also-make 的前提是--projects参数,表示同时构建所列模块依赖的其余模块。
例如我运行 mvn clean install -pl security-model-xml/ -am,会获得以下反应堆:
Java代码
这里security-model-xml依赖于security-model,而security-parent是security-model-xml的父项目,所以这两个模块都会得以构建。
--also-make-dependents 的前提是--projects参数,表示同时构建那些依赖于所列模块的模块。
例如我运行 mvn clean install -pl security-model-xml/ -amd,会获得以下反应堆:
Java代码
除了security-model-xml自己,全部其余依赖于该模块的模块也会被加入到反应堆中。
除此以外,在-pl、-am或者-pl、-amd的基础上,还能应用-rf参数,紧接着上面的例子,再加上参数-rf -rf security-rest-api/,
如:mvn clean install -pl security-model-xml/ -amd -rf security-rest-api/,即可以获得以下的反应堆:
Java代码
这个反应堆表示:计算全部security-model-xml及依赖于它的模块,在次基础上,从security-rest-api模块开始构建。
在开发过程当中,灵活应用上述4个参数,能够帮助咱们跳过那些无须构建的项目模块,从而加速构建,当项目庞大,模块特别多的时候,这种效果就异常明显。
最后提一下,Maven从2.1版本才加入了此功能。 :)