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

问题描述 投票:0回答:1

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

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

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

maven maven-plugin maven-profiles
1个回答
0
投票
[Maven中一个经常被误解的概念是parentaggregator之间的差异。 This article给它更多的亮点。实际上,通常同一项目同时扮演parentaggregator的角色,我认为这也是您的情况。

[如果是这样,您不能指望aggregator“首先被执行”,因为它的整个“执行”基本上是在执行子模块。

在您的情况下可能有用的是将parentaggregator分开。因此,您将拥有这样的结构:

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>中的第一个模块,并且可以在构建其他模块之前生成文件。

注意事项:

    这仅在您执行反应堆构建(聚合器)时有效。如果您构建单个模块,则它将不起作用,因为它不会触发父构建。
  • 亲子关系可能不是解决此问题的最佳方法。考虑将父级转换为产生工件的常规项目,并将生成的文件放入其中。然后将该项目作为依赖项添加到模块中,并使插件使用依赖项中的文件。这样,您还将解决前面提到的问题。
  • UPDATE:

  • 看起来好像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

    它接缝的是,如果模块指定了父对象(即使父对象是反应堆),则将在模块之前处理父对象。鉴于注释中的澄清(您的模块当前没有父级),最简单的解决方法是将reactor添加为parent

    然而,这可能会导致其他问题,并且上面的“注意事项”仍然有效。

    © www.soinside.com 2019 - 2024. All rights reserved.