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


110

在我的项目的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配置文件如何激活?
Pascal Thivent 09年

概要文件wls7和wls10在父POM中均为“ activeByDefault”。但是根据客户需求,只有wls10或两者都由脚本(带有“ -P”参数)
构建

Answers:


145

可以通过将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,它按预期解决。
Greg Domjan

它对我没有用。我想使用Maven 3.3.9在pom.xml中使用org.jenkins-ci.plugins的1.580.1版本重建Jenkins NodeJS插件v1.0。在我将〜/ .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom中的<source>手动更改为1.7之前,没有任何效果。
亚历山大·萨莫洛夫

6

我遇到过同样的问题。默认情况下,我的maven war插件排除了html文件。但是在我的验收测试资料中,我希望包含此文件。因此,当我再次添加Maven War插件时,它没有覆盖默认值。

为了解决这个问题,我传入了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>

1

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

从Maven 2.0.10开始,可以使用命令行停用一个或多个配置文件,方法是在其标识符前面加上字符'!'。或“-”,如下所示:

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

这可用于停用标记为activeByDefault的配置文件,或通过其他方式通过其激活配置激活的配置文件。

然后将您的配置添加到其他名称的配置文件中或直接添加到您的pom.xml


如前所述,我无法摆脱父POM,因为我继承了在框架中不同级别为我公司定义的许多配置。复制配置文件不是一个好主意,因为我需要报告父POM中的更改,而大多数情况下我并不了解它们。我只想为项目中的测试类的编译覆盖行为。
Guillaume Cernier 09年

重读我的答案,那不是我的建议。我建议停用配置文件,而不是摆脱父POM。然后,为什么还要报告父pom中的更改?没有什么可以强迫您这样做。
Pascal Thivent 09年

是的Pascal,感谢您的帮助,但是问题是,如果我停用wls7配置文件,我会摆脱很多配置(对于其他插件,maven一般的东西,...),我仍然需要。通过报告更改,我的意思是从父POM到我的POM。因为,使用您建议的解决方案,我将需要复制所有父POM(测试类的编译部分除外),并且如果负责父POM更改其POM中的某些内容,则需要警告我有任何更改不是当前的过程,也不是很实用。
Guillaume Cernier 09年

哦,好的,我明白了。但是,我不确定(但是我可能错了)您可以部分覆盖pom,因此对于所提供的详细信息,我没有更好的解决方案。
Pascal Thivent,09年

无论如何,非常感谢Pascal试图帮助我。实际上,由于特殊原因,我需要这种行为。也许还有另一种执行方法:
Guillaume Cernier 09年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.