Désactiver un plugin Maven défini dans un POM parent

158

J'utilise un POM parent qui définit un plugin que je ne souhaite pas exécuter dans un POM enfant. Comment puis-je désactiver complètement le plugin dans le pom enfant?

Contrainte: je ne peux pas modifier le POM parent lui-même.

tobiasbayer
la source

Réponses:

205

Ce qui suit fonctionne pour moi lors de la désactivation de Findbugs dans un POM enfant:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>ID_AS_IN_PARENT</id> <!-- id is necessary sometimes -->
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

Remarque: la définition complète du plugin Findbugs est dans notre parent / super POM, donc il héritera de la version et ainsi de suite.

Dans Maven 3, vous devrez utiliser:

 <configuration>
      <skip>true</skip>
 </configuration>

pour le plugin.

Alex
la source
8
Bien que cela soit "correct", c'est-à-dire que cela fonctionne, il convient de noter que c'est une fonctionnalité non spécifiée (ou du moins non documentée ). Il n'y a pas de phase officielle appelée «aucune». Donc, vous pourriez aussi bien mettre «foo» ici.
Marcel Stör
1
Pour moi, dans Maven 3, cela ne fonctionne pas. <skip> true </skip> comme les œuvres suggérées par
bmargulies
10
J'ai dû ajouter la <id>…</id>partie du POM parent, puis cela a fonctionné pour moi.
mirabilos
4
La solution Maven 3 ne désactive pas vraiment le plugin, n'est-ce pas? Selon la sortie, le plugin est toujours exécuté. La question de savoir si elle respecte ensuite la configuration de saut et comment / ce qu'elle choisit de sauter semble être du ressort du plugin individuel.
Zero3
10
Le commentaire de mirabilos est la bonne solution pour Maven 3 et est portable sur tous les plugins. Tous les plugins n'ont pas de <skip>paramètre.
Gili
60

Voir si le plugin a un paramètre de configuration 'skip'. Presque tous le font. si c'est le cas, ajoutez-le simplement à une déclaration dans l'enfant:

<plugin>
   <groupId>group</groupId>
   <artifactId>artifact</artifactId>
   <configuration>
     <skip>true</skip>
   </configuration>
</plugin>

Sinon, utilisez:

<plugin>    
<groupId>group</groupId>   
 <artifactId>artifact</artifactId>    
<executions>
     <execution>
       <id>TheNameOfTheRelevantExecution</id>
       <phase>none</phase>
     </execution>    
</executions>  
</plugin>
bmargulies
la source
Que diriez-vous de nommer le plugin avec lequel vous travaillez et d'exécuter help: effective-pom pour voir si vous avez vraiment l'exécution correcte.
bmargulies
1
Recherchez également les plugins par rapport à pluginManagement. Le dernier l'emporte sur le premier.
bmargulies
J'utilise le plugin Cobertura et je ne veux pas l'exécuter dans le pom enfant.
tobiasbayer
Le but de contrôle a un saut en 2.5. Ce n'était pas avant. Le but de cobertura ne le fait pas.
bmargulies
Je ne veux pas sauter uniquement la vérification mais toute l'exécution du plugin.
tobiasbayer
37

Le fil est vieux, mais peut-être que quelqu'un est toujours intéressé. La forme la plus courte que j'ai trouvée est une amélioration supplémentaire de l'exemple de λlex et bmargulies. La balise d'exécution ressemblera à:

<execution>
    <id>TheNameOfTheRelevantExecution</id>
    <phase/>
</execution>

2 points que je souhaite souligner:

  1. La phase est réglée sur rien, ce qui semble moins piraté que «aucun», bien que toujours un hack.
  2. id doit être identique à l'exécution que vous souhaitez remplacer. Si vous ne spécifiez pas d'id pour l'exécution, Maven le fera implicitement (d'une manière que vous n'attendiez pas intuitivement).

Après avoir posté trouvé qu'il est déjà dans stackoverflow: Dans un projet multi-module Maven, comment puis-je désactiver un plugin chez un enfant?

Ivan Bondarenko
la source
1
Pour mémoire: les ID d'exécution par défaut suivent des règles simples qui sont énoncées dans cette réponse: stackoverflow.com/a/34599117/7641
Jens Bannmann
2
Il est intéressant de noter que cette solution désactive en fait (comme OP l'a demandé) le plugin (pour l'ID d'exécution donné) au lieu de s'appuyer sur une option "skip" spécifique au plugin.
Zero3
3

Je sais que ce fil est vraiment vieux mais la solution de @Ivan Bondarenko m'a aidé dans ma situation.

J'ai eu ce qui suit dans mon pom.xml.

<build>
    ...
    <plugins>
         <plugin>
                <groupId>com.consol.citrus</groupId>
                <artifactId>citrus-remote-maven-plugin</artifactId>
                <version>${citrus.version}</version>
                <executions>
                    <execution>
                        <id>generate-citrus-war</id>
                        <goals>
                            <goal>test-war</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    </plugins>
</build>

Ce que je voulais, c'était désactiver l'exécution de generate-citrus-warpour un profil spécifique et c'était la solution:

<profile>
    <id>it</id>
    <build>
        <plugins>
            <plugin>
                <groupId>com.consol.citrus</groupId>
                <artifactId>citrus-remote-maven-plugin</artifactId>
                <version>${citrus.version}</version>
                <executions>
                    <!-- disable generating the war for this profile -->
                    <execution>
                        <id>generate-citrus-war</id>
                        <phase/>
                    </execution>

                    <!-- do something else -->
                    <execution>
                        ...
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>
Liviu Ilea
la source