version control - Ejecutar el objetivo del complemento Maven en el módulo principal, pero no en los hijos
version-control maven-2 (5)
Como se documenta en la sección de Plugins de la referencia pom:
Más allá de la coordenada estándar de groupId: artifactId: version, hay elementos que configuran el complemento o esta interacción de compilaciones con él.
- inherited: true o false, independientemente de si esta configuración de complemento debe aplicarse a los POM heredados de este.
Así que solo agregue <inherited>false</inherited>
a la configuración buildnumber-maven-plugin para evitar la herencia en los POM secundarios:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<inherited>false</inherited>
...
</plugin>
Tenemos un proyecto maven de múltiples módulos que usa un perfil que define un buildnumber-maven-plugin para incrementar un número de compilación y luego verificarlo en el control de la fuente.
Si defino el complemento en el pom.xml padre, también se ejecuta para todas las compilaciones secundarias.
Aquí está mi padre pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.webwars</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<properties>
<buildNumber.properties>${basedir}/../parent/buildNumber.properties</buildNumber.properties>
</properties>
<version>1.0-SNAPSHOT</version>
<name>Parent Project</name>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<buildNumberPropertiesFileLocation>${buildNumber.properties}</buildNumberPropertiesFileLocation>
<getRevisionOnlyOnce>true</getRevisionOnlyOnce>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
<format>{0, number}</format>
<items>
<item>buildNumber</item>
</items>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>checkin</goal>
</goals>
</execution>
</executions>
<configuration>
<basedir>${basedir}</basedir>
<includes>buildNumber.properties</includes>
<message>[Automated checkin] of ${basedir} Build version: ${major.version}.${minor.version}.${buildNumber}</message>
<developerConnectionUrl>...</developerConnectionUrl>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<modules>
<module>../common</module>
<module>../data</module>
<module>../client</module>
<module>../webplatform</module>
</modules>
...
</project>
Hay una opción incorporada de maven: mvn --help ... -N,--non-recursive Do not recurse into sub-projects
Puede agregar <inherited>false</inherited>
a la configuración del complemento para evitar la herencia en los POM secundarios:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<inherited>false</inherited>
...
</plugin>
O bien, si su complemento tiene múltiples ejecuciones, puede controlar qué ejecuciones se heredan y cuáles no al agregar la etiqueta heredada al cuerpo de la ejecución:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>parent-only</id>
<phase>initialize</phase>
<inherited>false</inherited>
<configuration>
<target>
<echo message="Echoed only by this module."/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>all-modules</id>
<phase>initialize</phase>
<inherited>true</inherited> <!-- Defaults to true, so you could leave this line out -->
<configuration>
<target>
<echo message="Echoed in this module and each child module."/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Si el complemento es personalizado y usted tiene acceso al código MOJO del complemento, puede marcar el complemento como aggregator
; si el comportamiento esperado es aplicable para todos los proyectos donde se usará el complemento.
Como se menciona en la especificación de la API Mojo ,
Marca este Mojo para ejecutarlo en forma de varios módulos, es decir, agregar la compilación con el conjunto de proyectos enumerados como módulos.
Ejemplo,
@Mojo(name = "createHF", inheritByDefault = false, aggregator = true)
public class CreateHFMojo extends AbstractMojo {
..
public void execute() throws MojoExecutionException, MojoFailureException {
....
}
..
}
Ejemplo detallado en github .
Solo una adición a las excelentes respuestas aquí: nótese que la herencia por ejecución está rota en Maven 2: http://jira.codehaus.org/browse/MNG-3959