8

我有一个多模块 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

4

2 回答 2

13

利用combine.children="append" combine.self="override"

父 POM

<configuration>
  <items>
    <item>parent-1</item>
    <item>parent-2</item>
  </items>
  <properties>
    <parentKey>parent</parentKey>
  </properties>
</configuration>

儿童绒球

<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>

有关更多详细信息,请参阅此博客

于 2011-08-05T16:39:47.590 回答
4

是和不是。当然,子 pom 可以覆盖其父级指定的插件的配置,我必须假设您这样做是正确的,因为它没有什么难的。如果您检查 的输出mvn help:effective-pom,您应该能够清楚地看到该模块对发布插件有不同的设置。

您遇到的问题是发布插件的行为。通常,如果你运行一个目标或阶段mvn compile——例如——从项目的根模块运行,它首先在根模块上运行该目标/阶段,然后在所有模块上按反应器顺序运行,几乎就像你' d 自己在每个模块中运行它。您添加到子模块的任何自定义项都会按预期生效。当您运行发布插件时,它只运行在根模块。它不在任何子模块中运行。相反,在根模块上运行它会使用与根模块相同的设置来创建一个新的构建,它以几乎相同的方式为所有其他模块运行,除了它对所有模块使用根模块的配置。我不知道确切的语义,但我相信这类似于您在每个子模块中手动运行发布目标并在命令行中将配置选项指定为系统属性:无论子模块如何配置发布插件,命令行参数获胜。

我自己从来没有处理过这个问题,如果不确切知道你想要完成什么,很难说。也许如果您可以在这个特殊模块中将您想做的事情表达为配置文件,那么您可以将配置文件添加到您的goalsand 或preparationGoals. 或者,您可以arguments选择准备和执行目标,您可以利用这些选项获得一些技巧。

于 2011-08-03T02:30:38.893 回答