是否可以覆盖已为父 POM 中的配置文件定义的插件的配置?

Posted

技术标签:

【中文标题】是否可以覆盖已为父 POM 中的配置文件定义的插件的配置?【英文标题】:Is it possible to override the configuration of a plugin already defined for a profile in a parent POM? 【发布时间】:2010-12-18 19:09:29 【问题描述】:

在我项目的 POM 父文件中,我有这样一个配置文件,定义了一些对这个项目有用的配置(这样我就无法摆脱这个父 POM):

<profile>
<id>wls7</id>
...
<build>
  <plugins>
    <!-- use java 1.4 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <source>1.4</source>
        <target>1.4</target>
        <meminitial>128m</meminitial>
        <maxmem>1024m</maxmem>
        <executable>%$jdk14.executable</executable>
      </configuration>
    </plugin>
  </plugins>
</build>

...
</profile>

但在我的项目中,我只想覆盖 maven-compiler-plugin 的配置,以便使用 jdk5 而不是 jdk4 来编译测试类。

这就是我在项目的 POM 中做这部分的原因:

<profiles>
  <profile>
    <id>wls7</id>
        <activation>
            <property>
                <name>jdk</name>
                <value>4</value>
            </property>
        </activation>
    <build>
      <directory>target-1.4</directory>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <executions>
            <execution>
              <id>my-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <fork>true</fork>
                <executable>$jdk15.executable</executable>
                <compilerVersion>1.5</compilerVersion>
                <source>1.5</source>
                <target>1.5</target>
                <verbose>true</verbose>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
              ...
</profiles>

它不工作......

我什至试图覆盖我 POM 的常规插件部分中的配置(我的意思是,不是针对特定配置文件,而是针对我的整个 POM)。

可能是什么问题?

澄清我的一些要求:

我不想摆脱父母 POM 和配置文件 (wls7) 定义 在里面(因为我需要很多很多 属性,配置,...)和 这不是我的过程 公司。 基于复制的解决方案 父 POM 和/或配置文件 里面定义不好 一。既然如果负责 父 POM 改变了一些东西,我 必须在我的报告中。

这只是一个继承问题(扩展或覆盖配置文件,来自上层 POM 的配置),所以我认为 Maven 2 应该可以。

【问题讨论】:

wls7 配置文件是如何激活的? 配置文件 wls7 和 wls10 在父 POM 中都是“activeByDefault”。但是根据客户的需要,只有wls10或者两者都是通过脚本构建的(带“-P”参数) 【参考方案1】:

可以通过将combine.self="override" 属性添加到您的 pom 中的元素来覆盖父 pom 中的配置。

尝试将您的插件配置更改为:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>my-testCompile</id>
          <phase>test-compile</phase>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration combine.self="override">
            <fork>true</fork>
            <executable>$jdk15.executable</executable>
            <compilerVersion>1.5</compilerVersion>
            <source>1.5</source>
            <target>1.5</target>
            <verbose>true</verbose>
          </configuration>
        </execution>
      </executions>
    </plugin>

有关覆盖插件的更多信息,请参阅:http://maven.apache.org/pom.html

【讨论】:

对于 Maven2.2.1,如果您在配置文件中执行此操作,它似乎不会与父配置文件中定义的插件合并,而是覆盖它们。如果您直接在构建部分定义相同的插件,它就可以工作。对于 Maven3,它按预期解决。 它对我不起作用。我想使用 Maven 3.3.9 在 pom.xml 中使用 org.jenkins-ci.plugins 的 1.580.1 版本重建 Jenkins NodeJS Plugin v1.0。直到我手动将 ~/.m2/repository/org/jenkins-ci/jenkins/1.34/jenkins-1.34.pom 中的 更改为 1.7 之前,没有任何效果。【参考方案2】:

我有同样的问题。默认情况下,我的 Maven 战争插件排除了一个 html 文件。但是在我的验收测试配置文件中,我希望包含这个文件。因此,当我再次添加 Maven 战争插件时,它并没有覆盖默认值。

为了解决这个问题,我传入了 combine.self 属性并且工作正常。

默认构建:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <packagingExcludes>swagger-ui/client.html</packagingExcludes>
    </configuration>
</plugin>

验收测试简介:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>

【讨论】:

【参考方案3】:

您是否尝试停用 wls7 配置文件(自 maven 2.0.10 起):

从 Maven 2.0.10 开始,一个或 可以使用禁用更多配置文件 通过在命令行中添加前缀 带有任一字符的标识符 '!'或'-'如下图:

mvn groupId:artifactId:goal -P !profile-1,!profile-2

这可用于停用 标记为 activeByDefault 的配置文件或 否则将是 通过他们的激活激活 配置。

然后将您的配置添加到具有不同名称的配置文件中或直接添加到您的pom.xml

【讨论】:

正如我上面所说,我无法摆脱父 POM,因为我在框架中继承了为我所有公司在不同级别定义的许多配置。并且复制配置文件不应该是一个好主意,因为我需要报告父 POM 中的更改,而且我通常不知道它们。我只想覆盖仅在我的项目中编译测试类的行为。 重读我的答案,这不是我的建议。我建议停用配置文件,而不是摆脱父 POM。那么,为什么必须报告父 pom 中的更改?没有什么能强迫你这样做。 是的帕斯卡,感谢您的帮助,但问题是,如果我停用 wls7 配置文件,我会摆脱很多配置(对于其他插件,maven 一般的东西,...)我仍然需要.通过报告更改,我的意思是从父 POM 到我的 POM。因为,使用您建议的解决方案,我需要复制所有父 POM(除了用于编译测试类的部分),如果负责的父 POM 更改了他的 POM 中的某些内容,我需要警告任何更改是不是目前的流程,也不是很实用。 哦,好的,我现在明白了。但是,我不确定(但我可能错了)您可以部分覆盖 pom,因此我没有提供的详细信息更好的解决方案。 无论如何,非常感谢 Pascal 试图帮助我。事实上,我之所以需要这样的行为,是出于某种特殊的原因。也许还有另一种方法来执行它:

以上是关于是否可以覆盖已为父 POM 中的配置文件定义的插件的配置?的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ④ ( 默认生成的 pom 文件 | Maven 中的 pom 配置 | 自定义 pom 文件节点 )

是否可以使用 Maven POM 文件为 Maven 发布插件配置 GIT Tag?

POM文件详解

PTTest 失败且未生成突变覆盖率

Maven 配置文件属性不会覆盖弹簧配置中的值

Maven中plugins和pluginManagement的区别