2011-11-29 13 views
99

Tenemos la necesidad de omitir un submódulo en ciertos entornos.Omitir un submódulo durante una compilación de Maven

El módulo en cuestión contiene pruebas de integración y tarda media hora en ejecutarse. Por lo tanto, queremos incluirlo cuando construimos en el servidor de CI, pero cuando los desarrolladores crean localmente (y se ejecutan las pruebas), queremos omitir ese módulo.

¿Hay alguna manera de hacerlo con una configuración de perfil? He hecho algunas búsquedas en Google y he mirado otras preguntas/respuestas aquí y no he encontrado una buena solución.

Supongo que una opción es eliminar por completo ese submódulo del elemento primario pom.xml, y simplemente agregar otro proyecto en nuestro servidor de CI para simplemente compilar ese módulo.

Sugerencias?

+0

¿Por qué no Maven Way? Es un reclamo perfectamente válido para mí. – MaDa

+0

Hmm. Ahora no puedo encontrar los lugares donde la gente parecía estar discutiendo contra esto ... así que actualicé mi pregunta original para eliminar mi afirmación de que esto no parece ser "The Maven Way". – denishaskin

Respuesta

113

Claro, esto se puede hacer utilizando perfiles. Puede hacer algo como lo siguiente en su pom.xml principal.

... 
    <modules> 
     <module>module1</module> 
     <module>module2</module> 
     ... 
    </modules> 
    ... 
    <profiles> 
    <profile> 
     <id>ci</id> 
      <modules> 
      <module>module1</module> 
      <module>module2</module> 
      ... 
      <module>module-integration-test</module> 
      </modules> 
     </profile> 
    </profiles> 
... 

En su CI, ejecutaría experto con el perfil ci, es decir,mvn -P ci clean install

+2

¡Ooh! Eso es bueno. Más simple que mi sugerencia. –

+3

¡Excelente respuesta! No sé por qué me costó tanto encontrar esto en los documentos de Maven. La única sugerencia que haría es que, como prefiero que las pruebas de integración se ejecuten de manera predeterminada, agregué 'activeByDefault' a ese perfil, y luego tuve que agregar otro perfil vacío (p.'skip-integration-tests') para poder omitirlos. – denishaskin

+5

¿hay alguna manera de hacer esto sin duplicar todas las cosas compartidas? –

5

La noción de proyectos de varios módulos está ahí para atender las necesidades de los segmentos codependientes de un proyecto. Tal cliente depende de los servicios, que a su vez dependen de, por ejemplo, EJB o rutinas de acceso a datos. Usted podría agrupe sus pruebas de integración continua (CI) de esta manera. Lo racionalizaría diciendo que las pruebas de CI deben estar en paso de bloqueo con los cambios en la lógica de la aplicación.

Suponga que su proyecto se estructura como:

project-root 
    | 
    + --- ci 
    | 
    + --- client 
    | 
    + --- server 

El project-root/pom.xml define módulos

<modules> 
    <module>ci</module> 
    <module>client</module> 
    <module>server</module> 
</modules> 

El ci/pom.xml define perfiles tales como:

... 
<profiles> 
    <profile> 
    <id>default</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
     <skip>true</skip> 
     </configuration> 
    </plugin> 
    </profile> 
    <profile> 
    <id>CI</id> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
     <skip>false</skip> 
     </configuration> 
    </plugin> 
    </profile> 
</profiles> 

Esto resultará en Maven saltarse pruebas en este módulo, excepto cuando el perfil n amed CI está activo. Su servidor CI debe ser instruido para ejecutar mvn clean package -P CI. El sitio web de Maven tiene un in-depth explanation of the profiling mechanism.

32

Es posible decidir qué proyectos reactor para construir especificando el argumento de la línea -pl comando:

$ mvn --help 
[...] 
-pl,--projects <arg>     Build specified reactor projects 
             instead of all projects 
[...] 

Se acepta una lista separada por comas de los parámetros en una de las siguientes formas:

  • ruta relativa de la carpeta que contiene el POM
  • [groupId]:artifactId

Por lo tanto, teniendo en cuenta la siguiente estructura:

project-root [com.mycorp:parent] 
    | 
    + --- server [com.mycorp:server] 
    |  | 
    |  + --- orm [com.mycorp.server:orm] 
    | 
    + --- client [com.mycorp:client] 

se puede especificar la siguiente línea de comandos:

mvn -pl .,server,:client,com.mycorp.server:orm clean install 

que construir todo. Elimine los elementos de la lista para compilar solo los módulos que desee.


EDIT: blackbuild como señaló, a partir de Maven 3.2.1 tiene a new -el flag que excluye los proyectos del reactor, de manera similar a lo que hace -pl:

+1

Gracias. Esto funcionó bien para mí. También tenga en cuenta que puede agregar el "-am" (AKA "--also-make") para también crear proyectos que son requeridos por los módulos que ha especificado. – GaZ

+1

¡Genial! Usé 'mvn install -pl .' para instalar parent pom solo en repos locales sin construir módulos. – Marcin

+0

Además, eche un vistazo a https://jira.codehaus.org/browse/MNG-5230. Ahora puede excluir proyectos del reactor. – blackbuild

111

versión Maven 3.2.1 añade esta función, puede usar el interruptor -pl con el "!" excluir ciertos submódulos

mvn -pl '!submodule-to-exclude' install 

¡Ten cuidado en el carácter bash! es un personaje especial, por lo que tiene que citarlo solo (como lo hice yo) o escapar con la barra invertida.

La sintaxis para excluir módulo múltiple es la misma que la inclusión

mvn -pl '!submodule1,!submodule2' install 

EDITAR no parece Windows para recibir las comillas simples, pero es necesario en bash; en Windows, utilice comillas dobles (gracias @awilkinson)

mvn -pl "!submodule1,!submodule2" install 
+9

Importante: si quiere excluir un submódulo anidado, debe usar la versión calificada 'mvn -pl ! com.acme: nestedmodule1' –

2

hay ahora (desde la versión 1.1.1) un 'saltar' bandera en el pozo.

Así que usted puede hacer cosas como:

<profile> 
     <id>pit</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.pitest</groupId> 
        <artifactId>pitest-maven</artifactId> 
        <configuration> 
         <skip>true</skip> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

en su módulo, y el hoyo se saltará

[INFO] --- pitest-Maven: 1.1.3: mutationCoverage (default-CLI) @ module-selenium --- [INFO] Salto proyecto

Cuestiones relacionadas