plugin perform mvn exclude example dependency maven inheritance

maven - exclude - mvn release perform



Activar automáticamente el complemento principal en Maven (6)

Hasta donde yo sé, no hay una solución genérica para esto. Al menos por el momento ...

Una idea (no lo probé, pero puede funcionar) es definir, en el padre pom.xml, un objetivo de ejecución que no existe, por ejemplo:

<executions> <execution> <goals> <goal>noGoal</goal> </goals> </execution> </executions>

y en cada niño, redefine una meta correcta.

El problema de esta solución (si funciona, por supuesto;)) es que debe redefinir la configuración del complemento para cada niño. De lo contrario, no se ejecutará.

¿Es posible tener un complemento definido en el POM padre que está desactivado, y cuando el niño hereda este complemento, se activa automáticamente?


Puede declarar un complemento en el pom de nivel superior y decir que se omita y luego decirle que no se omita en el nivel secundario. No es completamente automático, pero es muy minimalista en la anulación de la verbosidad.

Parent Pom, deshabilitando el complemento, pero declarando todas las configuraciones:

<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-surefire-plugin</artifactid> <configuration> <skip>true</skip> ...lots more config... ...lots more config... ...lots more config... </configuration> </plugin>

Child Pom, habilitando el complemento:

<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-surefire-plugin</artifactid> <configuration> <skip>false</skip> </configuration> </plugin>


Supongo que quieres configurar el complemento en tu pom padre, pero solo utilízalo en los proyectos heredados. Maven tiene una sección para esto: configure sus complementos en pluginManagement, pero agréguelos a una fase justo cuando lo necesite, por ejemplo, omita la etiqueta de fase en pluginManagement, pero especifíquelo en heredado pom.


Fui con la siguiente solución:

  • Configure el complemento en parent-pom en la sección pluginManagement. Enlace el complemento a una fase existente.

  • Desactive el complemento para parent-pom vinculándolo a una fase inexistente: anule la fase en la sección de complementos.

  • Active el complemento en cada pom hijo incluyendo el complemento en la sección de complementos.

Ejemplo parent-pom:

<defaultGoal>install</defaultGoal> <pluginManagement> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <executions> <execution> <id>install-ejb-client</id> <phase>install</phase> <goals> <goal>install-file</goal> </goals> <configuration> <file>${ejb-client-file}</file> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <packaging>jar</packaging> <classifier>client</classifier> </configuration> </execution> </executions> </plugin> ... </plugins> </pluginManagement> <plugins> <plugin> <!-- deactivate the plugin for this project, only child-projects do generate ejb-clients --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <inherited>false</inherited> <executions> <execution> <id>install-ejb-client</id> <phase>none</phase> </execution> </executions> </plugin> ... </plugins> </build>

Ejemplo child-pom:

<build> <plugins> ... <plugin> <!-- Install the generated client-jar. Property ''ejb-client-file'' has to be set! Plugin configuration is in the parent pom --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> </plugin> ... </plugins> </build>


Entonces ''siddhadev'' es exactamente correcto. Puede definir la configuración del complemento en el pom padre con un ID dado:

<build> <pluginManagement> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>child-caller</id> <!-- ''phase'' omitted --> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo message="called from child!" /> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>

Y, en el POM hijo, puede enumerar explícitamente la fase a la que debe llamarse esto:

<build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>child-caller</id> <phase>compile</phase> </execution> </executions> </plugin> </plugins> </build>

Lo he usado para apuntar a varios JRE. Desafortunadamente, como no puede usar el compilador maven-compiler con diferentes directorios de destino (que considero un error en el complemento), debe usar Ant.


Esto no es exactamente lo que buscas, pero creo que funcionará lo suficientemente bien para ti.

Si declara el complemento en una etiqueta pluginManagement en el elemento primario, la configuración será heredada por cualquier proyecto secundario que declare ese complemento.

Por ejemplo, en el padre declara que el complemento de compilación usa Java 5 para la compilación de prueba.

<pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <executions> <execution> <id>test-compile</id> <goals> <goal>testCompile</goal> </goals> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement>

Luego, en un niño, declara simplemente el complemento del compilador y la configuración del padre se heredará:

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> </plugins> </build>