2009-11-03 13 views
46

Tenemos un proyecto maven de varios 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 origen.Ejecutar el objetivo del complemento Maven en el módulo principal, pero no en los hijos

Si defino el complemento en el pom.xml principal, 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> 

Respuesta

78

como se documenta en la sección Plugins de la referencia pom:

Más allá de la norma de coordenadas de groupId: artifactId: versión, hay elementos que configuran el complemento o esto genera interacción con él.

  • heredado: verdadera o falsa, si o no este plugin de la configuración debe aplicarse a los POM que heredan de éste.

Entonces sólo tiene que añadir <inherited>false</inherited> a la configuración BuildNumber-maven-plugin para evitar la herencia en los niños POM:

 <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>buildnumber-maven-plugin</artifactId> 
     <version>1.0-beta-3</version> 
     <inherited>false</inherited> 
     ... 
     </plugin> 
21

Puedes añadir <inherited>false</inherited> a la configuración del plugin para evitar la herencia en los niños POM:

 <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>buildnumber-maven-plugin</artifactId> 
     <version>1.0-beta-3</version> 
     <inherited>false</inherited> 
     ... 
     </plugin> 

O, si su complemento tiene múltiples ejecuciones, puede controlar qué ejecuciones se heredan y cuáles son No añadiendo la etiqueta heredada al cuerpo de 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> 
4

Hay un built-in opción experta: mvn --help ... -N,--non-recursive Do not recurse into sub-projects

1

Si el plugin es uno personalizado y tiene acceso a plugin de código MOJO, puede marcar el plugin como aggregator; si el comportamiento esperado es aplicable para todos los proyectos donde se usará el complemento.

Como se mencionó en Mojo API Specification,

Banderas esta Mojo se ejecuten de una manera múltiple módulo, es decir, el agregado construcción con el conjunto de proyectos que figuran como módulos.

ejemplo,

@Mojo(name = "createHF", inheritByDefault = false, aggregator = true) 
public class CreateHFMojo extends AbstractMojo { 

.. 

public void execute() throws MojoExecutionException, MojoFailureException { 
.... 
} 

.. 

} 

ejemplo detallada en github.

Cuestiones relacionadas