Deaktivieren Sie ein Maven-Plugin, das in einem übergeordneten POM definiert ist

157

Ich verwende ein übergeordnetes POM, das ein Plugin definiert, das nicht in einem untergeordneten POM ausgeführt werden soll. Wie kann ich das Plugin im Child Pom vollständig deaktivieren?

Einschränkung: Ich kann das übergeordnete POM selbst nicht ändern.

Tobiasbayer
quelle

Antworten:

204

Folgendes funktioniert für mich beim Deaktivieren von Findbugs in einem untergeordneten POM:

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

Hinweis: Die vollständige Definition des Findbugs-Plugins befindet sich in unserem übergeordneten / Super-POM, sodass es die Version und so weiter erbt.

In Maven 3 müssen Sie Folgendes verwenden:

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

für das Plugin.

Alex
quelle
8
Obwohl dies "korrekt" ist, dh funktioniert, sollte beachtet werden, dass es sich um eine nicht spezifizierte (oder zumindest nicht dokumentierte ) Funktion handelt. Es gibt keine offizielle Phase namens "keine". Sie können also genauso gut "foo" dort setzen.
Marcel Stör
1
Für mich in Maven 3 funktioniert das nicht. <skip> true </ skip> wie bmargulies Werke vorgeschlagen
mibutec
10
Ich musste den <id>…</id>Teil des übergeordneten POM hinzufügen , dann funktionierte es für mich.
Mirabilos
4
Die Maven 3-Lösung deaktiviert das Plugin jedoch nicht wirklich, oder? Entsprechend der Ausgabe wird das Plugin noch ausgeführt. Ob es dann die Sprungkonfiguration respektiert und wie / was es zum Überspringen auswählt, scheint dem einzelnen Plugin zu überlassen.
Zero3
10
Der Kommentar von mirabilos ist die richtige Lösung für Maven 3 und kann auf alle Plugins übertragen werden. Nicht alle Plugins haben einen <skip>Parameter.
Gili
60

Überprüfen Sie, ob das Plugin einen Konfigurationsparameter zum Überspringen hat. Fast alle tun es. Wenn dies der Fall ist, fügen Sie es einfach einer Deklaration im Kind hinzu:

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

Wenn nicht, verwenden Sie:

<plugin>    
<groupId>group</groupId>   
 <artifactId>artifact</artifactId>    
<executions>
     <execution>
       <id>TheNameOfTheRelevantExecution</id>
       <phase>none</phase>
     </execution>    
</executions>  
</plugin>
bmargulies
quelle
Wie wäre es, wenn Sie das Plugin benennen, mit dem Sie arbeiten, und Hilfe ausführen: effektiv-pom, um zu sehen, ob Sie wirklich die richtige Ausführung haben.
Bmargulies
1
Achten Sie auch auf Plugins versus PluginManagement. Letzteres überschreibt Ersteres.
Bmargulies
Ich verwende das Cobertura-Plugin und möchte es nicht im Kinder-Pom ausführen.
Tobiasbayer
Das Check-Ziel hat einen Sprung in 2.5. Das hat es vorher nicht getan. Das Cobertura-Ziel nicht.
Bmargulies
Ich möchte nicht nur die Prüfung überspringen, sondern die gesamte Plugin-Ausführung.
Tobiasbayer
37

Der Thread ist alt, aber vielleicht ist noch jemand interessiert. Die kürzeste Form, die ich gefunden habe, ist eine weitere Verbesserung des Beispiels von λlex und bmargulies. Das Ausführungs-Tag sieht folgendermaßen aus:

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

2 Punkte, die ich hervorheben möchte:

  1. Phase ist auf nichts gesetzt, was weniger hackig aussieht als "keine", obwohl immer noch ein Hack.
  2. Die ID muss mit der Ausführung übereinstimmen, die Sie überschreiben möchten. Wenn Sie keine ID für die Ausführung angeben, wird Maven dies implizit tun (auf eine Weise, die Sie nicht intuitiv erwarten).

Nachdem das Posting gefunden wurde, befindet es sich bereits im Stackoverflow: Wie kann ich in einem Maven-Projekt mit mehreren Modulen ein Plugin in einem Kind deaktivieren?

Ivan Bondarenko
quelle
1
Für die Aufzeichnung: Die Standardausführungs-IDs folgen einfachen Regeln, die in dieser Antwort dargelegt werden
Jens Bannmann
2
Es ist erwähnenswert, dass diese Lösung das Plugin (für die angegebene Ausführungs-ID) tatsächlich deaktiviert (wie von OP angefordert ), anstatt sich auf eine Plugin-spezifische "Überspringen" -Option zu verlassen.
Zero3
3

Ich weiß, dass dieser Thread wirklich alt ist, aber die Lösung von @Ivan Bondarenko hat mir in meiner Situation geholfen.

Ich hatte folgendes in meinem 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>

Was ich wollte, war, die Ausführung generate-citrus-warfür ein bestimmtes Profil zu deaktivieren, und dies war die Lösung:

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