我有一个具有以下结构的 Maven 项目
parent
-pom.xml
-module1
-pom.xml
-module2
-pom.xml
在父模块中,我有一个带有插件的配置文件,可以为所有子模块递归执行。但是当我构建项目时,我发现首先构建子模块,最后构建父模块。但我希望相反的情况发生。我希望插件首先针对父模块执行,然后针对子模块执行。因为只有当插件在父模块中执行时,才会生成一个供子模块使用的文件。因此,如果首先构建子模块,则由于文件丢失,插件执行将被跳过。
最佳答案
Maven 中经常被误解的概念是 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>
中的第一个模块并且它可以在构建其他模块之前生成该文件。
注意事项:
- 这仅在您执行 react 器构建(聚合器)时才有效。如果您构建单独的模块,它将不起作用,因为它不会触发父构建。
- 亲子关系或许不是解决这个问题的最佳方式。考虑将父项目转换为生成 Artifact 的常规项目并将生成的文件放入其中。然后将该项目添加为模块中的依赖项,并使插件使用依赖项中的文件。这样您也将解决前面提到的问题。
更新:
看起来 Maven 中发生了一些变化,或者可能是我记错了。我使用以下结构进行了快速检查(Maven 3.5.0)
- 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
这表明如果一个模块指定了一个父模块(即使父模块是 react 器),则父模块将在模块之前被处理。鉴于评论中的澄清(您的模块当前没有父模块),最简单的修复可能是添加 reactor
如parent
。
但这可能会导致其他问题,并且上面的“要记住的事情”仍然有效。
关于Maven 在其他模块之前构建父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58114108/