我知道 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来跳过父代?
P.S。为了防止混淆 - 我试图压制父级的配置文件执行并在same
构建期间在子级上启用它
答案 0 :(得分:14)
您不能跳过父版本,但您可以将配置文件配置为不通过一点点黑客激活。 This answer显示了如何通过基于文件的<activation>
元素的存在与否来控制配置文件的激活。这样,您可以在父项中定义配置文件,但在该项目中将其取消激活,因为父项中存在标记文件。子项目的源文件中没有标记文件,因此将为这些项目激活配置文件。
更新以澄清:在我的测试项目中,此配置意味着在父项目(其中包含src / main / resources中的文件)中停用了配置文件,但在所有未在其资源中具有该文件的子项目中激活该配置文件目录。
<profile>
<id>test</id>
<activation>
<file>
<missing>src/main/resources/test.marker</missing>
</file>
</activation>
...
</profile>
答案 1 :(得分:10)
构建父级有什么问题?
事实上,在Maven中,有两个不同的概念(通常同时使用):
第一个是对所有孩子都很常见的一切的定义。您将父级定义为pom打包项目,并且可以将其安装在存储库中。
当您构建此父级的子级时,Maven2将检索此父级以将父级pom与子级pom合并。您可以通过运行命令mvn help:effective-pom
来查看整个pom.xml。
在这种情况下,将不会构建父pom,只会从存储库中检索它。
第二种情况是包含modules
子项目列表的项目。原则是您在此项目上运行的每个命令也将在所有子模块上运行。模块的顺序将由Reactor定义,它将查看模块间的依赖关系,以找出必须在其他模块之前构建的模块。如果没有依赖项,那么它将采用父pom.xml中定义的模块列表。
在这种情况下,如果在根项目上运行命令,Maven2将首先构建根项目,然后构建子模块。您无法跳过根项目的创建。
编辑,感谢RichSeller评论
可以在Maven书籍here中找到多模块(聚合项目)和继承(父项目)之间差异的完整说明。
答案 2 :(得分:4)
我想记录我的情况有部分妥协(感谢maven用户邮件列表上的人提出建议)。基本上你需要将轮廓分成两部分。插件的可重用configuration
部分转到父POM,executions
保留在子POM中。然后,子项中的配置文件插件标记为inherited
并且瞧 - 在运行时父配置文件未执行,因为它缺少executions
部分。这远非理想,但确实有效。例如,请参考to this link
答案 3 :(得分:2)
我无法实现上述Rick Seller提供的“缺失”文件解决方案。似乎一旦设置活动/非活动状态的配置文件将不会被更改,即使模块中缺少标记文件。然而,这是我的问题的确切解决方案。警告:这仅适用于Maven 2.1 +
如果我有一个父POM定义了2个模块:foo和boo那么在正常情况下执行顺序将是:
我需要做的就是跳过父版本是添加这个命令行开关
mvn install –rf foo
或者你可以使用--resume-from
它将做什么是跳过父节点并从foo模块继续。现在 - 我正在调查是否可以通过配置Reactor插件(P.S。 - 不能它)来实现这一点,但即使使用开关,上面的场景也适用于我
答案 4 :(得分:1)
@ romaintaz对同一问题的回答暗示了这一点,Maven - skip parent project build
但是为了明确这一点,在父pom中,必须将包装元素指定为pom(而不是jar或war)。
例如:
<packaging>pom</packaging>