2010-11-05 10 views
14

Tengo un proyecto que se compone de dos módulos diferentes. No tengo control sobre los archivos pom de estos módulos y, por lo tanto, no puedo modificarlos. Tengo el control total sobre el archivo pom del proyecto. La identificación del proyecto no está definida como una matriz en los módulos.¿Cómo ejecutar un objetivo diferente para un módulo de un proyecto de varios módulos?

estructura de carpetas:

project 
+ module1 
+ module2 

Como parte de un trabajo en torno necesito para ejecutar dos objetivos diferentes para los dos módulos, de modo que el módulo 1 se instala en el repositorio local, pero no Module2. Esto es solo un ejemplo. Mi problema real contiene más niveles con más de 2 módulos por nivel.

Para minimizar la configuración necesaria para mi sistema CI, deseo ejecutar esto en una sola llamada.

que estaba "soñando" de algo en la línea de

mvn install -Dspecial=module:compile 

Es esto posible y si es así, ¿cómo puedo hacer eso?

Respuesta

24

(...) Para minimizar la configuración necesaria para mi sistema CI, quiero ejecutar esto en una sola llamada.

Me temo que esto no será posible. Como expliqué en this answer, la fase o el objetivo invocado como parte de una compilación de varios módulos se ejecuta contra todos los módulos.

Si desea ejecutar una fase o una meta diferente para un subconjunto de los sub-módulos, usted tiene que llamar dos veces al experto, tal vez utilizando los --projects, -pl opciones para escoger el subconjunto derecha:

  • mvn -pl module1,module3 somegoal
  • mvn -pl module2 someothergoal
0

La única manera de controlar qué objetivos/ejecuciones (no fases) se ejecutan durante una Maven construir lo que su proyecto tiene módulo o no, es a través de los perfiles.

Por ejemplo:

/pom.xml

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company</groupId> 
    <artifactId>parent</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>module1</module> 
     <module>module2</module> 
    </modules> 
</project> 

/module1/pom.xml

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>parent</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>module1</artifactId> 
</project> 

/module2/pom.xml

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>parent</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>module2</artifactId> 

    <profiles> 
     <profile> 
      <id>module2:ignore-compile</id> 

      <build> 
       <plugins> 
        <plugin> 
         <artifactId>maven-compiler-plugin</artifactId> 
         <executions> 
          <execution> 
           <id>default-compile</id> 
           <phase>none</phase> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

Cuando se ejecuta mvn -Pmodule2:ignore-compile package. Notarás que la compilación de la fuente (¡pero solo este objetivo/ejecución!) Se ignorará para el módulo2.

Puede también utilizar activation:

<profiles> 
    <profile> 
     <id>module2:ignore-compile</id> 

     <activation> 
      <property> 
       <name>module2:ignore-compile</name> 
      </property> 
     </activation> 
     .... 
    </profile> 
</profiles> 

A continuación, con el comando: mvn -Dmodule2:ignore-compile package

Por último, una capacidad interesante es cambiar el módulo a través de un perfil:

/pom.xml

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company</groupId> 
    <artifactId>parent</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>module1</module> 
    </modules> 

    <profiles> 
     <profile> 
      <id>with:module2</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 

      <modules> 
       <module>module2</module> 
      </modules> 
     </profile> 
    </profiles> 
</project> 

Para ignorar module2: mvn '-P!with:module2' package

Cuestiones relacionadas