2009-11-03 16 views
46

Mamy wielomodułowy projekt maven, który używa profilu, który definiuje buildnumber-maven-plugin, aby zwiększyć numer kompilacji, a następnie sprawdzić go w kontroli źródła.Wykonaj zadanie wtyczki Maven na module nadrzędnym, ale nie na dzieciach

Jeśli zdefiniuję wtyczkę w nadrzędnym pliku pom.xml, zostanie ona wykonana dla wszystkich wersji potomnych.

Oto mój rodzic 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> 

Odpowiedz

78

Jak udokumentowano w sekcji Plugins odniesienia pom:

poza standardowe współrzędnych z GroupID: artifactId: Wersja istnieją elementy, które konfigurują wtyczka lub to buduje z nią interakcję.

  • dziedziczone: prawdziwe czy fałszywe, czy ta konfiguracja wtyczki powinny mieć zastosowanie do POM, które dziedziczą z tego.

Więc po prostu dodać <inherited>false</inherited> konfiguracji buildNumber-maven-plugin, aby uniknąć dziedziczenia u dzieci POM:

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

Możesz dodać <inherited>false</inherited> do konfiguracji wtyczki, aby uniknąć dziedziczenia u dzieci POM:

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

Lub, jeśli twoja wtyczka ma wiele egzekucji, możesz kontrolować, które egzekucje są dziedziczone, a które nie dodając dziedziczone tag do ciała wykonanie:

<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

Jest wbudowany opcja Maven: mvn --help ... -N,--non-recursive Do not recurse into sub-projects

1

Jeśli wtyczka jest zwyczaj jeden i masz dostęp do wtyczki kod MOJO, można oznaczyć jako wtyczki aggregator; jeśli oczekiwane zachowanie dotyczy wszystkich projektów, w których wtyczka ma być używana.

Jak wspomniano w Mojo API Specification,

Flagi to Mojo uruchomić go w multi modułu sposób, czyli zbiorczej kompilacji z zestawu projektów wymienionych w modułach.

przykład,

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

.. 

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

.. 

} 

szczegółowy przykład na github.