Ist es möglich, die Konfiguration eines Plugins zu überschreiben, das bereits für ein Profil in einem übergeordneten POM definiert wurde?

108

In einer übergeordneten POM-Datei meines Projekts habe ich ein solches Profil, das einige für dieses Projekt nützliche Konfigurationen definiert (damit ich dieses übergeordnete POM nicht entfernen kann):

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

Aber in meinem Projekt möchte ich nur die Konfiguration des Maven-Compiler-Plugins überschreiben, um jdk5 anstelle von jdk4 zum Kompilieren von Testklassen zu verwenden.

Deshalb habe ich diesen Abschnitt im POM meines Projekts erstellt:

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

und es funktioniert nicht ...

Ich habe sogar versucht, die Konfiguration in regulären Plugin-Abschnitten meines POM zu überschreiben (ich meine, nicht für ein bestimmtes Profil, sondern für mein gesamtes POM).

Was könnte das Problem sein?

Um einige meiner Anforderungen zu klären:

  • Ich möchte das übergeordnete POM und das darin definierte Profil (wls7) nicht loswerden (da ich viele, viele Eigenschaften, Konfigurationen usw. benötige), und das ist in meinem Unternehmen nicht der Prozess.
  • Eine Lösung, die auf dem Duplizieren des übergeordneten POM und / oder des darin definierten Profils basiert, ist nicht gut. Da, wenn der Verantwortliche des
    übergeordneten POM etwas ändert,
    müsste ich es in meinem melden.

Es ist nur eine Vererbungssache (ein Profil erweitern oder überschreiben, eine Konfiguration aus einem POM der oberen Ebene), daher denke ich, dass dies mit Maven 2 möglich sein sollte.

Guillaume Cernier
quelle
Wie wird das wls7-Profil aktiviert?
Pascal Thivent
Die Profile wls7 und wls10 sind beide "activeByDefault" im übergeordneten POM. Aber je nach Kundenwunsch werden nur die wls10 oder beide von Skripten (mit dem Parameter "-P") erstellt
Guillaume Cernier

Antworten:

144

Das Überschreiben von Konfigurationen von einem übergeordneten Pom kann durch Hinzufügen des combine.self="override"Attributs zum Element in Ihrem Pom erfolgen.

Versuchen Sie, Ihre Plugin-Konfiguration zu ändern:

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

Weitere Informationen zum Überschreiben von Plugins finden Sie unter: http://maven.apache.org/pom.html

Rolf
quelle
Es scheint, dass für Maven2.2.1, wenn Sie dies in einem Profil tun, es nicht mit Plugins zusammengeführt wird, die in übergeordneten Profilen definiert sind, sondern diese überschreibt. Wenn Sie dasselbe Plugin direkt im Build-Abschnitt definieren, funktioniert es. Für Maven3 wurde es wie erwartet gelöst.
Greg Domjan
Bei mir hat es nicht funktioniert. Ich wollte Jenkins NodeJS Plugin v1.0 mit Version 1.580.1 von org.jenkins-ci.plugins in der pom.xml mit Maven 3.3.9 neu erstellen. Bis ich die <Quelle> im ~ / .m2 / Repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom manuell auf 1.7 geändert habe, hat nichts funktioniert.
Alexander Samoylov
6

Ich hatte das gleiche Problem. Standardmäßig hat mein Maven War Plugin eine HTML-Datei ausgeschlossen. Aber in meinem Profil für Abnahmetests wollte ich, dass diese Datei enthalten ist. Als ich das Maven War Plugin erneut hinzufügte, wurde die Standardeinstellung nicht überschrieben.

Um dieses Problem zu beheben, habe ich das Attribut kombinieren.self übergeben und gut funktioniert.

Standard-Build:

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

Abnahmetestprofil:

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

Haben Sie versucht, das wls7-Profil zu deaktivieren (seit maven 2.0.10):

Ab Maven 2.0.10 können ein oder mehrere Profile über die Befehlszeile deaktiviert werden, indem ihrem Bezeichner entweder das Zeichen '!' Vorangestellt wird. oder '-' wie unten gezeigt:

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

Dies kann verwendet werden, um Profile zu deaktivieren, die als activeByDefault markiert sind, oder Profile, die andernfalls über ihre Aktivierungskonfiguration aktiviert würden.

Fügen Sie dann Ihre Konfiguration in einem Profil mit einem anderen Namen oder direkt in Ihrem hinzu pom.xml.

Pascal Thivent
quelle
Wie ich oben sagte, kann ich das übergeordnete POM nicht loswerden, da ich viele Konfigurationen erbe, die für mein gesamtes Unternehmen auf verschiedenen Ebenen im Framework definiert sind. Das Duplizieren von Profilen sollte keine gute Idee sein, da ich Änderungen im übergeordneten POM melden müsste und diese meistens nicht kenne. Ich möchte das Verhalten nur für die Zusammenstellung von Testklassen in meinem Projekt überschreiben.
Guillaume Cernier
Lesen Sie meine Antwort noch einmal, das habe ich nicht vorgeschlagen. Ich schlug vor, ein Profil zu deaktivieren und das übergeordnete POM nicht loszuwerden. Warum müssten Sie dann Änderungen im übergeordneten POM melden? Nichts zwingt dich dazu.
Pascal Thivent
Ja Pascal, danke für deine Hilfe, aber das Problem ist, dass ich, wenn ich das wls7-Profil deaktiviere, eine Menge Konfiguration (für andere Plugins, allgemeine Dinge, ...), die ich noch brauche, los werde. Und mit dem Melden von Änderungen meinte ich VON dem übergeordneten POM zu meinem POM. Da ich mit der von Ihnen vorgeschlagenen Lösung den gesamten übergeordneten POM duplizieren müsste (mit Ausnahme des Abschnitts zum Zusammenstellen von Testklassen) und wenn der verantwortliche übergeordnete POM etwas in seinem POM ändert, muss ich vor Änderungen gewarnt werden nicht der aktuelle Prozess und nicht sehr praktisch.
Guillaume Cernier
Ohh, ok, ich verstehe es jetzt. Ich bin mir jedoch nicht sicher (aber ich kann mich irren), dass Sie einen Pom teilweise überschreiben können, damit ich mit den bereitgestellten Details keine bessere Lösung habe.
Pascal Thivent
Wie auch immer, vielen Dank an Pascal für den Versuch, mir zu helfen. Tatsächlich brauche ich ein solches Verhalten aus einem bestimmten Grund. Vielleicht gibt es einen anderen Weg, es auszuführen:
Guillaume Cernier