我有一个具有以下结构的Maven项目
parent
-pom.xml
-module1
-pom.xml
-module2
-pom.xml
在父级中,我有一个带有插件的配置文件,可以对所有子模块递归执行。但是,当我构建项目时,我发现首先构建了子模块,最后构建了父模块。但是我希望相反的事情发生。我希望插件首先针对父模块执行,然后针对子模块执行。因为仅当在父级中执行插件时,才会生成要由子级模块使用的文件。因此,如果首先构建子模块,则由于缺少文件而跳过插件执行。
parent
和aggregator
之间的差异。 This article给它更多的亮点。实际上,通常同一项目同时扮演parent
和aggregator
的角色,我认为这也是您的情况。 [如果是这样,您不能指望aggregator
“首先被执行”,因为它的整个“执行”基本上是在执行子模块。
在您的情况下可能有用的是将parent
与aggregator
分开。因此,您将拥有这样的结构:
aggregator
- pom.xml (where you have <modules>...<modules>)
- parent
-pom.xml (no parent)
- module1
-pom.xml (parent is `parent` and not `aggregator`)
- module2
-pom.xml (parent is `parent` and not `aggregator`)
通过这种方式,您可以将parent
放置为<modules>...<modules>
中的第一个模块,并且可以在构建其他模块之前生成文件。注意事项:
这仅在您执行反应堆构建(聚合器)时有效。如果您构建单个模块,则它将不起作用,因为它不会触发父构建。
- 亲子关系可能不是解决此问题的最佳方法。考虑将父级转换为产生工件的常规项目,并将生成的文件放入其中。然后将该项目作为依赖项添加到模块中,并使插件使用依赖项中的文件。这样,您还将解决前面提到的问题。
看起来好像Maven中的某些事情发生了变化,或者我记得它错了。我使用以下结构进行了快速检查(Maven 3.5.0) UPDATE:
- project A - pom.xml (type pom, has <modules><module>B</module><module>C</module></modules>) - project B - pom.xml (has parent A) - project C - pom.xml (no parent)
当我在mvn
上运行A
时的结果是:
[INFO] Reactor Build Order: [INFO] [INFO] C [INFO] A [INFO] B
它接缝的是,如果模块指定了父对象(即使父对象是反应堆),则将在模块之前处理父对象。鉴于注释中的澄清(您的模块当前没有父级),最简单的解决方法是将reactor
添加为parent
。然而,这可能会导致其他问题,并且上面的“注意事项”仍然有效。