親POMのプロファイルにすでに定義されているプラ​​グインの構成を上書きすることはできますか?


109

私のプロジェクトの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>

しかし、私のプロジェクトでは、テストクラスのコンパイルにjdk4の代わりにjdk5を使用するために、maven-compiler-pluginの設定をオーバーライドしたいだけです。

私がプロジェクトの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 2009年

プロファイルwls7とwls10は、両方とも親POMで「activeByDefault」です。しかし、お客様のニーズに応じて、wls10のみまたは両方がスクリプトによって(「-P」パラメーターを使用して)作成されます
Guillaume Cernier 2009年

回答:


144

親pomの設定を上書きするには、pom combine.self="override"の要素に属性を追加します。

プラグイン構成を次のように変更してみてください:

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

うまくいきませんでした。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に変更するまで、何も機能しませんでした。
Alexander Samoylov

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以降、1つ以上のプロファイルは、識別子の前に文字「!」を付けることで、コマンドラインを使用して非アクティブ化できます。または以下に示すように「-」:

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

これを使用して、activeByDefaultとしてマークされたプロファイル、またはアクティブ化構成を通じてアクティブ化されるプロファイルを非アクティブ化できます。

次に、別の名前でプロファイルに、またはに直接設定を追加しますpom.xml


上で述べたように、フレームワークのさまざまなレベルですべての会社に定義された多くの構成を継承しているため、親POMを取り除くことはできません。また、親POMの変更を報告する必要があり、ほとんどの場合それらを認識していないため、プロファイルを複製することは良い考えではありません。私のプロジェクトでテストクラスをコンパイルする場合にのみ、動作をオーバーライドしたいだけです。
ギヨームセルニエ2009年

私の答えをもう一度読んでください、それは私が提案したものではありません。親POMを削除するのではなく、プロファイルを非アクティブにすることを提案しました。では、なぜ親pomの変更を報告する必要があるのでしょうか。それを強制するものは何もありません。
Pascal Thivent 2009年

はいPascal、あなたの助けに感謝しますが、問題は、私がwls7プロファイルを非アクティブ化すると、多くの構成(他のプラグイン、Mavenの一般的なものなど)を取り除く必要があることです。そして、変更を報告するということは、親POMから私のPOMへということです。あなたが提案した解決策では、すべての親POM(テストクラスのコンパイル用のセクションを除く)を複製する必要があるため、担当の親POMが彼のPOMで何かを変更する場合は、次のような変更について警告する必要があります現在のプロセスではなく、あまり実用的ではありません。
ギヨームセルニエ09/11/23

ああ、わかりました、私は今それを手に入れました。しかし、私は確信がありません(しかし私は間違っているかもしれません)pomを部分的にオーバーライドできるので、提供された詳細でこれ以上の解決策はありません。
Pascal Thivent 2009年

とにかく、私を助けてくれたPascalに感謝します。実際、私は特定の理由のためにそのような行動が必要です。多分それを実行する別の方法があります:
ギヨーム・セルニエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.