Deshabilitar un complemento Maven definido en un POM padre

158

Estoy usando un POM principal que define un complemento que no quiero que se ejecute en un POM secundario. ¿Cómo puedo desactivar completamente el complemento en el pom niño?

Restricción: No puedo cambiar el POM padre mismo.

tobiasbayer
fuente

Respuestas:

205

Lo siguiente funciona para mí cuando deshabilito Findbugs en un niño 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>

Nota: la definición completa del complemento Findbugs está en nuestro padre / super POM, por lo que heredará la versión y demás.

En Maven 3, deberás usar:

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

para el complemento

Alex
fuente
8
Si bien esto es "correcto", es decir, funciona, debe tenerse en cuenta que es una característica no especificada (o al menos no documentada ). No hay una fase oficial llamada 'ninguna'. Entonces, también podrías poner 'foo' allí.
Marcel Stör
1
Para mí en Maven 3 esto no funciona. <skip> verdadero </skip> como bmargulies sugirió trabajos
mibutec
10
Tuve que agregar la <id>…</id>parte del POM principal, luego funcionó para mí.
mirabilos
44
Sin embargo, la solución Maven 3 realmente no deshabilita el complemento, ¿verdad? Según el resultado, el complemento aún se ejecuta. Si respeta la configuración de omisión y cómo / qué elige omitir, parece depender del complemento individual.
Zero3
10
El comentario de mirabilos es la solución correcta para Maven 3 y es portátil en todos los complementos. No todos los complementos tienen un <skip>parámetro.
Gili
60

Vea si el complemento tiene un parámetro de configuración 'omitir'. Casi todos lo hacen. si es así, simplemente agréguelo a una declaración en el elemento secundario:

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

Si no, entonces use:

<plugin>    
<groupId>group</groupId>   
 <artifactId>artifact</artifactId>    
<executions>
     <execution>
       <id>TheNameOfTheRelevantExecution</id>
       <phase>none</phase>
     </execution>    
</executions>  
</plugin>
bmargulies
fuente
¿Qué te parece nombrar el complemento con el que estás trabajando y ejecutar help: efectivo-pom para ver si realmente tienes la ejecución correcta?
bmargulies
1
También busque plugins versus pluginManagement. El último anula al primero.
bmargulies
Estoy usando el complemento Cobertura y no quiero ejecutarlo en el niño pom.
tobiasbayer
El objetivo de verificación tiene un salto en 2.5. No lo hizo antes. El objetivo de cobertura no.
bmargulies
No quiero omitir solo el cheque, sino toda la ejecución del complemento.
tobiasbayer
37

El hilo es viejo, pero tal vez alguien todavía está interesado. La forma más corta que encontré es una mejora adicional en el ejemplo de λlex y bmargulies. La etiqueta de ejecución se verá así:

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

2 puntos que quiero destacar:

  1. La fase no se establece en nada, lo que parece menos hacky que 'none', aunque sigue siendo un hack.
  2. id debe ser lo mismo que la ejecución que desea anular. Si no especifica la identificación para la ejecución, Maven lo hará implícitamente (de una manera que usted no espera intuitivamente).

Después de publicarlo, ya se encuentra en stackoverflow: en un proyecto de varios módulos de Maven, ¿cómo puedo desactivar un complemento en un niño?

Ivan Bondarenko
fuente
1
Para el registro: los ID de ejecución predeterminados siguen reglas simples que se establecen en esta respuesta: stackoverflow.com/a/34599117/7641
Jens Bannmann
2
Vale la pena señalar que esta solución en realidad deshabilita (como solicitó OP) el complemento (para la ID de ejecución dada) en lugar de confiar en una opción de "omisión" específica del complemento.
Zero3
3

Sé que este hilo es muy antiguo, pero la solución de @Ivan Bondarenko me ayudó en mi situación.

Tenía lo siguiente en mi 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>

Lo que quería era deshabilitar la ejecución de generate-citrus-warun perfil específico y esta era la solución:

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