我有一个多模块maven构建,其中一个子模块需要额外的目标才能作为发布的一部分执行。但看起来似乎忽略了子模块中maven-release-plugin的任何配置,而支持父模块中的默认配置。
这是子模块的片段。插件配置在父pom的pluginManagement部分中是相同的,但没有自定义元素。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
<configuration>
<tagBase>http://mycompany.com/svn/repos/myproject/tags</tagBase>
<goals>deploy myCustomPlugin:myCustomGoal</goals>
</configuration>
</plugin>
子模块是否可以覆盖父模块的配置并添加额外的目标?
Maven版本2.2.1
答案 0 :(得分:11)
使用combine.children="append"
combine.self="override"
家长POM
<configuration>
<items>
<item>parent-1</item>
<item>parent-2</item>
</items>
<properties>
<parentKey>parent</parentKey>
</properties>
</configuration>
儿童pom
<configuration>
<items combine.children="append">
<!-- combine.children="merge" is the default -->
<item>child-1</item>
</items>
<properties combine.self="override">
<!-- combine.self="merge" is the default -->
<childKey>child</childKey>
</properties>
</configuration>
<强>结果强>
<configuration>
<items combine.children="append">
<item>parent-1</item>
<item>parent-2</item>
<item>child-1</item>
</items>
<properties combine.self="override">
<childKey>child</childKey>
</properties>
</configuration>
有关详细信息,请参阅this blog
答案 1 :(得分:3)
是和否。当然,一个子pom可以覆盖其父级指定的插件的配置,我必须假设你已经正确完成了,因为没有什么真的很难。如果检查mvn help:effective-pom
的输出,您应该能够清楚地看到此模块对发布插件有不同的设置。
您遇到的问题是发布插件的行为。通常,如果您从项目的根模块运行目标或阶段 - 例如mvn compile
,它首先在根模块上运行该目标/阶段,然后在反应堆顺序中运行所有模块,几乎就像你自己在每个模块中运行它一样。您添加到子模块的任何自定义都会按预期生效。运行发布插件时,它在根模块上仅运行 。它不会在任何子模块中运行。相反,在根模块上运行它使用与根模块相同的设置来分配新构建,根模块以几乎相同的方式运行所有其他模块,除了它使用根模块的所有模块的配置。我不知道确切的语义,但我相信这类似于您在每个子项中手动运行发布目标并在命令行中将配置选项指定为系统属性:无论子模块如何配置发布插件,命令行args win。
我自己从未处理过这个问题,如果不确切知道自己要完成什么,就很难说。也许如果您可以在此特殊模块中将自己想要的内容表达为个人资料,则可以向goals
或preparationGoals
添加个人资料。或者,准备和执行目标都有arguments
option,你可以用它来汲取一些技巧。