Maven - 跳过父项目构建

Posted

技术标签:

【中文标题】Maven - 跳过父项目构建【英文标题】:Maven - skip parent project build 【发布时间】:2010-12-02 20:16:47 【问题描述】:

我知道在一天内询问两次是 mauvais ton,但这是另一个 Maven 谜题:

我有一个父 POM,它定义了 5 个模块(5 个子项目)。由于每个模块的执行方式完全相同,我将<profile><build> 部分拉到父 POM 中以消除重复代码。现在 - 如果我从每个模块单独执行构建它可以工作,但是如果我想一次构建所有模块并移动到父目录我得到错误,因为 Maven 尝试执行的第一件事是父项目本身:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

在构建失败后,因为 exec 插件试图执行不存在的东西。查看输出很明显,reactor 插件正在驱动构建,但是如何配置 reactor 以跳过父级?

附:为防止混淆 - 我试图在 same 构建期间抑制父级上的配置文件执行并在子级上启用它

【问题讨论】:

底线:maven 缺乏对组合的支持,如果你只从父级构建是不可能的 【参考方案1】:

您不能跳过父版本,但您可以将配置文件配置为不通过小技巧激活。 This answer 展示了如何通过基于文件的<activation> 元素的存在与否来控制配置文件的激活。这样,您可以在父项中定义配置文件,但由于父项中存在标记文件,因此在该项目中将其停用。子项目的源中没有标记文件,因此将为这些项目激活配置文件。

更新澄清:在我的测试项目中,此配置意味着配置文件在父项目(在 src/main/resources 中有文件)中被停用,但在所有资源中没有文件的子项目中被激活目录。

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

【讨论】:

丰富——这就是我想要的答案!就 romanitaz 而言 - 我想要两者:聚合和将公共代码拉到父级的能力(对谁执行该代码没有意义)。 有钱 - 如果我能多打扰你一点。我试图通过使用属性而不是丢失文件来达到相同的效果。它不起作用。即使我将属性声明粘贴到我孩子的 POM 中,我的个人资料也永远不会被激活。这是为什么?属性是否声明为“预建”并且从不重置?也许我应该问另一个问题,以便我可以放代码示例? 不,它应该根据属性的存在来激活(maven.apache.org/guides/introduction/… 有一个例子),如果你不能让它工作,请随时问另一个问题 我头晕目眩 :( 无法使用属性 is.gd/3QLtl 使其工作。而且它不适用于文件标记 ether。我在我父母的顶部文件夹中有 build.terminator 文件(在 pom.xml 旁边)。如果我在激活部分将其称为&lt;missing&gt;build.terminator&lt;/missing&gt; - 找到文件并且不为父母和孩子执行配置文件。如果我更改为&lt;missing&gt;$basedir/build.terminator&lt;/missing&gt;,那么父母和孩子都会被执行意味着Maven看不到文件?什么给出? 抱歉 Rich - 我必须删除“已回答”复选标记。您的解决方案将非常适合从父级或子级构建执行以太。我说的是父母中的“跳过”配置文件,并在同一个构建周期中继续在孩子中执行。我认为这就是混乱的来源 - 我将修改原始帖子【参考方案2】:

构建父级有什么问题?

其实在Maven中,有两个不同的概念(一般同时使用):

父 POM 模块聚合

第一个是对所有孩子共有的一切的定义。您将父项目定义为 pom 打包的项目,并且可以将其安装在您的存储库中。

当您构建这个父级的子级时,Maven2 将检索这个父级以将父级 pom 与子级 pom 合并。您可以通过运行命令mvn help:effective-pom 查看整个 pom.xml。

在这种情况下,不会构建父 pom,只会从存储库中检索它。

第二种情况是一个包含modules 子项目列表的项目。原则是您在该项目上运行的每个命令也将在所有子模块上运行。模块的顺序将由 Reactor 定义,它将查看模块间的依赖关系以找出必须在其他模块之前构建的模块。如果没有依赖项,那么它将采用父 pom.xml 中定义的模块列表。

在这种情况下,如果您在根项目上运行命令,Maven2 将首先构建根项目,然后再构建子模块。您不能跳过根项目的创建。


编辑,感谢 RichSeller 的评论

关于多模块(聚合项目)和继承(父项目)的区别的完整解释可以在Maven书here中找到。

【讨论】:

+1 指出这一点,请参阅 Maven 书籍了解更多详细信息:sonatype.com/books/maven-book/reference/… 是的,我想指出这一点,因为通常人们认为聚合和父项目是一回事,不能分开使用。 构建父级有什么问题?简单 - 个人资料中发生的事情适用于孩子,但对父母没有意义。就您而言-我需要:聚合和提取可重用代码的能力。配置文件激活 - 正如 Rich Seller 所评论的那样是完美的解决方案 或者也许是完美的解决方案。到目前为止我无法让它工作 @RomainLinsolas 我确实在几个微服务(子项目)中使用了父 POM(第一个项目符号),但每个微服务仍然得到烦人的 [INFO] Scanning for projects... [WARNING] Failed to build parent project for。如何摆脱这些警告?我根本没想到父 pom.xml 是构建的!【参考方案3】:

我想记录下我的情况存在部分妥协(感谢 maven 用户邮件列表中的人的建议)。基本上你需要把轮廓切成两块。插件的可重用 configuration 部分转到父 POM,executions 留在子 POM 中。然后子配置文件插件被标记为inherited 和瞧 - 在运行时父配置文件没有执行,因为它缺少executions 部分。这远非理想,但确实有效。例如参考to this link

【讨论】:

有趣,感谢您在此处发布此内容。但是,链接有效还是只有我? 对我有用,但你可以试试完整版mail-archives.apache.org/mod_mbox/maven-users/200812.mbox/… Pascal - 你可能想看看我的最新评论 这对我有用。其他问题似乎在 Sonatype 遇到了对修复的阻力。我觉得很烦人。但这已经足够好了。【参考方案4】:

我无法实施上述 Rick Seller 提供的“丢失”文件解决方案。似乎一旦设置了配置文件的活动/非活动状态,即使模块中缺少标记文件,也不会更改。但是,这是我的问题的确切解决方案。警告:这仅从 Maven 2.1+ 开始可用

如果我有一个定义了 2 个模块的父 POM:foo 和 boo,那么在正常情况下,执行顺序将是:

    父母 富 嘘

跳过父构建我需要做的就是添加这个命令行开关

mvn install –rf foo

或者,您可以使用--resume-from 它会跳过父级并从 foo 模块向下继续。现在 - 我正在调查是否可以通过配置 Reactor 插件来实现这一点(附注 - 不,它不能) 但即使使用开关,上述场景对我来说也能正常工作

【讨论】:

【参考方案5】:

@romaintaz 对同一问题的回答暗示了这一点,Maven - skip parent project build

但为了明确这一点,在父 pom 中,您必须将包装元素指定为 pom(而不是 jar 或 war)。 示例:

<packaging>pom</packaging>

【讨论】:

以上是关于Maven - 跳过父项目构建的主要内容,如果未能解决你的问题,请参考以下文章

在 netbeans 7 中,如何在构建 maven 项目时跳过测试并添加 maven 附加参数?

Java Maven 项目中的 Docker 指令跳过测试

Maven跳过测试

maven:如何通过命令行选项跳过某些项目中的测试?

Maven入门项目创建

构建一个简单的Spring Boot项目