Maven 在其他模块之前构建父级

标签 maven maven-plugin maven-profiles

我有一个具有以下结构的 Maven 项目

parent
  -pom.xml
  -module1
     -pom.xml
  -module2
     -pom.xml

在父模块中,我有一个带有插件的配置文件,可以为所有子模块递归执行。但是当我构建项目时,我发现首先构建子模块,最后构建父模块。但我希望相反的情况发生。我希望插件首先针对父模块执行,然后针对子模块执行。因为只有当插件在父模块中执行时,才会生成一个供子模块使用的文件。因此,如果首先构建子模块,则由于文件丢失,插件执行将被跳过。

最佳答案

Maven 中经常被误解的概念是 parent 之间的区别和aggregatorThis article对此有更多的了解。实际上,同一个项目经常扮演这两个角色 parentaggregator我想这也是你的情况。

如果是这样,您就不能期望 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 器),则父模块将在模块之前被处理。鉴于评论中的澄清(您的模块当前没有父模块),最简单的修复可能是添加 reactorparent

但这可能会导致其他问题,并且上面的“要记住的事情”仍然有效。

关于Maven 在其他模块之前构建父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58114108/

相关文章:

java - 将 Maven WAR 插件与配置文件结合使用

maven - 在 Maven 配置文件中使用属性标签

tomcat - 从 cargo-maven2-plugin 以嵌入式模式启动 tomcat 的最简单方法是什么?

java - Maven: Artifact 的权限被拒绝

maven - 使用wildfly-maven-plugin创建安全域没有效果

java - 如何检查我的 Java 项目是否使用 log4j 以及哪个版本?

java - Maven,在 war 即将构建之前运行java方法或脚本

java - maven 项目报告.html 与 index.html

java - 在 Maven 中的配置文件之间共享配置文件配置的简单方法?

未正确传递 java 编译器注释处理器选项