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 旁边)。如果我在激活部分将其称为<missing>build.terminator</missing>
- 找到文件并且不为父母和孩子执行配置文件。如果我更改为<missing>$basedir/build.terminator</missing>
,那么父母和孩子都会被执行意味着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 - 跳过父项目构建的主要内容,如果未能解决你的问题,请参考以下文章