Est-il possible de remplacer la configuration d'un plugin déjà défini pour un profil dans un POM parent?

110

Dans un fichier parent POM de mon projet, j'ai un tel profil définissant certaines configurations utiles pour ce projet (afin que je ne puisse pas me débarrasser de ce POM parent):

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

Mais dans mon projet, je voudrais juste remplacer la configuration du maven-compiler-plugin afin d'utiliser jdk5 au lieu de jdk4 pour compiler des classes de test.

C'est pourquoi j'ai fait cette section dans le POM de mon projet:

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

et ça ne marche pas ...

J'ai même essayé de remplacer la configuration dans les sections de plug-in régulières de mon POM (je veux dire, pas pour un profil spécifique mais pour tout mon POM).

Quel pourrait être le problème ?

Pour clarifier certaines de mes exigences:

  • Je ne veux pas me débarrasser du POM parent et du profil (wls7) défini à l'intérieur (car j'ai besoin de nombreuses et nombreuses propriétés, configurations, ...) et ce n'est pas le processus dans mon entreprise.
  • Une solution basée sur la duplication du POM parent et / ou du profil défini à l'intérieur n'est pas une bonne solution. Puisque si le responsable du
    POM parent change quelque chose, je
    devrais le signaler dans le mien.

C'est juste une question d'héritage (étendre ou remplacer un profil, une configuration d'un POM de niveau supérieur) donc je pense que cela devrait être possible avec Maven 2.

Guillaume Cernier
la source
Comment le profil wls7 est-il activé?
Pascal Thivent
Les profils wls7 et wls10 sont tous deux "activeByDefault" dans le POM parent. Mais selon les besoins du client, seuls les wls10 ou les deux sont construits par des scripts (avec le paramètre "-P")
Guillaume Cernier

Réponses:

145

Le remplacement des configurations d'un pom parent peut être effectué en ajoutant l' combine.self="override"attribut à l'élément dans votre pom.

Essayez de changer la configuration de votre plugin pour:

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

Pour plus d'informations sur le remplacement des plugins, consultez: http://maven.apache.org/pom.html

Rolf
la source
Il semble que pour Maven2.2.1, si vous faites cela dans un profil, il ne fusionne pas avec les plugins définis dans les profils parents mais les remplace. Si vous définissez le même plugin directement dans la section de construction, cela fonctionne. Pour Maven3, il s'est résolu comme prévu.
Greg Domjan
Cela n'a pas fonctionné pour moi. Je voulais reconstruire Jenkins NodeJS Plugin v1.0 avec la version 1.580.1 de org.jenkins-ci.plugins dans le pom.xml en utilisant Maven 3.3.9. Jusqu'à ce que je change manuellement la <source> en 1.7 dans le ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom, rien ne fonctionnait.
Alexander Samoylov le
6

J'ai eu le même problème. Par défaut, mon plugin maven war excluait un fichier html. Mais dans mon profil de tests d'acceptation, je voulais ce fichier inclus. Donc, quand j'ai ajouté à nouveau le plugin maven war, il n'a pas remplacé la valeur par défaut.

Pour résoudre ce problème, j'ai passé l'attribut combine.self et j'ai bien fonctionné.

Version par défaut:

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

Profil de test d'acceptation:

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

Avez-vous essayé de désactiver le profil wls7 (depuis maven 2.0.10):

À partir de Maven 2.0.10, un ou plusieurs profils peuvent être désactivés à l'aide de la ligne de commande en préfixant leur identifiant avec le caractère '!' ou '-' comme indiqué ci-dessous:

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

Cela peut être utilisé pour désactiver les profils marqués comme activeByDefault ou les profils qui seraient autrement activés via leur configuration d'activation.

Et puis ajoutez votre configuration dans un profil avec un nom différent ou directement dans votre pom.xml .

Pascal Thivent
la source
Comme je l'ai dit plus haut, je ne peux pas me débarrasser du POM parent car j'hérite de nombreuses configurations définies pour toute mon entreprise à différents niveaux dans le framework. Et la duplication des profils ne devrait pas être une bonne idée, car j'aurais besoin de signaler les changements dans le POM parent et le plus souvent je n'en ai pas connaissance. Je voudrais juste remplacer le comportement uniquement pour la compilation des classes de test dans mon projet.
Guillaume Cernier
Relisez ma réponse, ce n'est pas ce que j'ai suggéré. J'ai suggéré de désactiver un profil, pas de se débarrasser du POM parent. Alors, pourquoi devriez-vous signaler les changements dans le pom parent? Rien ne vous oblige à faire ça.
Pascal Thivent
Oui Pascal, merci pour votre aide, mais le problème est que si je désactive le profil wls7 je me débarrasse de beaucoup de configuration (pour d'autres plugins, des trucs généraux maven, ...) dont j'ai encore besoin. Et en signalant les changements, je voulais dire DU POM parent À mon POM. Parce qu'avec la solution que vous avez suggérée, je devrais dupliquer tout le POM parent (à l'exception de la section pour la compilation des classes de test) et si le responsable du POM parent change quelque chose dans son POM, je dois être averti de tout changement qui est pas le processus actuel et pas très pratique.
Guillaume Cernier
Ohh, ok, je comprends maintenant. Cependant, je ne suis pas sûr (mais je me trompe peut-être) que vous puissiez remplacer partiellement un pom afin que je n'ai pas de meilleure solution avec les détails fournis.
Pascal Thivent
Quoi qu'il en soit, merci beaucoup Pascal d'avoir essayé de m'aider. En fait, j'ai besoin d'un tel comportement pour une raison particulière. Peut-être y a-t-il une autre façon de le jouer:
Guillaume Cernier