文档章节

关于maven多个模块的build顺序 [INFO] Reactor Build Order

临江仙卜算子
 临江仙卜算子
发布于 04/26 15:05
字数 1328
阅读 78
收藏 2

对于一个maven项目,如果有多个模块,那么它们的执行顺序是什么样的呢?

在执行mvn操作的时候,你可以看到如下信息,这个便是maven的build顺序

技术分享图片

那么maven是如何决定顺序的呢?如下:

 

在多模块Maven项目中,反应堆(Reactor)是一个包含了所有需要构建模块的抽象概念,对于Maven用户来说,主要关心的是两点:

  1. 哪些模块会被包含到反应堆中?
  2. 反应堆中所有模块的构建顺序是什么?

在默认情况下,Maven会根据多模块配置构建所有的模块,Maven还会根据模块间的依赖关系自动计算构建顺序,以确保被依赖的模块会先得以构建。值得一提的是,在这种情形下,Maven会将父模块看成是其子模块的依赖。

 

在多模块Maven项目中,反应堆(Reactor)是一个包含了所有需要构建模块的抽象概念,对于Maven用户来说,主要关心的是两点:

 

  1. 哪些模块会被包含到反应堆中?
  2. 反应堆中所有模块的构建顺序是什么?

 

例如有这样的一个多模块项目:

 

 

plexus-security包含了8个子模块,其中security-realms还包括了更进一层的两个子模块。

运行mvn clean install可以看到这样的输出:

 

Java代码 

 收藏代码

  1. [INFO] Scanning for projects...  
  2. [INFO] ------------------------------------------------------------------------  
  3. [INFO] Reactor Build Order:  
  4. [INFO]   
  5. [INFO] Plexus Security Aggregator  
  6. [INFO] Security: Parent  
  7. [INFO] Security: Model  
  8. [INFO] Security: XML Model  
  9. [INFO] Security: Configuration  
  10. [INFO] Security: System  
  11. [INFO] Security: Realms Parent  
  12. [INFO] Plexus XML Realm  
  13. [INFO] Security: REST API  
  14. [INFO] Plexus URL Realm  
  15. [INFO] Security Legacy Adapter  
  16. [INFO]                                                                           
  17. [INFO] ------------------------------------------------------------------------  

 

在默认情况下,Maven会根据多模块配置构建所有的模块,Maven还会根据模块间的依赖关系自动计算构建顺序,以确保被依赖的模块会先得以构建。值得一提的是,在这种情形下,Maven会将父模块看成是其子模块的依赖,因此该例中Security Parent会较先得以构建。

 

一般来说,我们要么构建整个项目,要么构建单个模块,但是有些时候,我们会想要仅仅构建这个完整的反应堆中的某些模块,换句话说,我们会需要裁剪反应堆。

例如说,我对模块security-configuration做了一些更改,而我知道在完整反应堆顺序中,security-model-xml和security-model在其之前,不会依赖它,因此就没必要构建他们。我们只需要构建security-configuration及其之后的项目。

 

Maven提供了很多命令行选项让我们自定义反应堆,输入mvn -h可以看到这样一些选项:

 

Java代码 

 收藏代码

  1. Options:  
  2.  -am,--also-make                        If project list is specified, also  
  3.                                         build projects required by the  
  4.                                         list  
  5.  -amd,--also-make-dependents            If project list is specified, also  
  6.  -pl,--projects <arg>                   Build specified reactor projects  
  7.                                         instead of all projects. A project  
  8.                                         can be specified by  
  9.                                         [groupId]:artifactId or by its  
  10.                                         relative path.  
  11.  -rf,--resume-from <arg>                Resume reactor from specified  
  12.                                         project  

 

 

--resume-from 表示从该模块恢复,也就是说选择从哪里开始构建,等于剪掉了完整反应堆的前面一部分。

例如我运行 mvn clean install -rf security-configuration/ ,就会得到这样的一个反应堆:

 

Java代码 

 收藏代码

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Configuration  
  5. [INFO] Security: System  
  6. [INFO] Security: Realms Parent  
  7. [INFO] Plexus XML Realm  
  8. [INFO] Security: REST API  
  9. [INFO] Plexus URL Realm  
  10. [INFO] Security Legacy Adapter  
  11. [INFO]                                                                           
  12. [INFO] ------------------------------------------------------------------------  

  

与完整反应堆相比,前面的四个模块不见了,只保留了security-system及其之后的模块。

 

--projects 表示手动选择需要构建的项目,项目间以逗号分隔。

例如我运行 mvn clean install -pl security-configuration/,security-realms/security-xml-realm/,会得到如下反应堆:

 

Java代码 

 收藏代码

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Configuration  
  5. [INFO] Plexus XML Realm  
  6. [INFO]                                                                           
  7. [INFO] ------------------------------------------------------------------------  

 

--also-make 的前提是--projects参数,表示同时构建所列模块依赖的其他模块。

例如我运行 mvn clean install -pl security-model-xml/ -am,会得到如下反应堆:

 

Java代码 

 收藏代码

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Parent  
  5. [INFO] Security: Model  
  6. [INFO] Security: XML Model  
  7. [INFO]                                                                           
  8. [INFO] ------------------------------------------------------------------------  

 

 

这里security-model-xml依赖于security-model,而security-parent是security-model-xml的父项目,因此这两个模块都会得以构建。

 

--also-make-dependents 的前提是--projects参数,表示同时构建那些依赖于所列模块的模块。

例如我运行 mvn clean install -pl security-model-xml/ -amd,会得到如下反应堆:

 

Java代码 

 收藏代码

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: XML Model  
  5. [INFO] Plexus XML Realm  
  6. [INFO] Security: REST API  
  7. [INFO] Plexus URL Realm  
  8. [INFO] Security Legacy Adapter  
  9. [INFO]                                                                           
  10. [INFO] ------------------------------------------------------------------------  

 

 

除了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代码 

 收藏代码

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: REST API  
  5. [INFO] Plexus URL Realm  
  6. [INFO] Security Legacy Adapter  
  7. [INFO]                                                                           
  8. [INFO] ------------------------------------------------------------------------  

 

 

这个反应堆表示:计算所有security-model-xml及依赖于它的模块,在次基础上,从security-rest-api模块开始构建。

 

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

 

最后提一下,Maven从2.1版本才加入了此功能。 :)

© 著作权归作者所有

共有 人打赏支持
临江仙卜算子
粉丝 16
博文 299
码字总数 229344
作品 0
郑州
CEO
私信 提问
【maven学习】划分模块

所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。 一个简单的Maven模块结构是这样的: 上述简...

冷冷gg
2016/08/20
66
0
安装SpringSide 4.0.0.RC2 报错,求解?错误信息如下

[Pre-Requirement] Makesure install JDK 6.0+ and set the JAVA_HOME. [Pre-Requirement] Makesure install Maven 3.0.4+ and set the PATH. [Step 1] Install all springside modules to l......

马文武
2012/04/23
889
1
maven项目多模块部署的时候构建顺序

今天在构建dp-onedata的时候出现一个问题,问题描述如下 根目录的pom文件如下 dponedata有2个子模块,分别是common模块和web模块,其中web模块依赖commot模块 common模块配置即parent的子模块...

王小明123
2016/08/01
1K
0
执行quick-start.bat报错,确定JDK与Maven已经安装好了

报这个错误是为什么? [Pre-Requirement] Makesure install JDK 6.0+ and set the JAVA_HOME. [Pre-Requirement] Makesure install Maven 3.0.4+ and set the PATH. [Step 1] Install all sp......

gongxu5566
2012/06/22
1K
3
执行maven命令 clean tomcat7:run 报错

[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] e3-manager [INFO] e3-ma......

xin3333444
2017/07/17
4.4K
7

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
21
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
17
0
my.ini

1

architect刘源源
今天
15
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
15
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部