Omitir un submódulo durante una compilación de Maven

160

Necesitamos poder omitir un submódulo en ciertos entornos.

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

¿Hay alguna manera de hacer esto con una configuración de perfil? Busqué en Google y miré las otras preguntas / respuestas aquí y no he encontrado una buena solución.

Supongo que una opción es eliminar ese submódulo del padre por pom.xmlcompleto y simplemente agregar otro proyecto en nuestro servidor de CI para construir ese módulo.

Sugerencias?

denishaskin
fuente
¿Por qué no Maven Way? Es un reclamo perfectamente válido para mí.
MaDa
Hmm Ahora no puedo encontrar los lugares donde la gente parecía estar discutiendo en contra de esto ... así que actualicé mi pregunta original para eliminar mi afirmación de que esto no parece ser "The Maven Way".
denishaskin

Respuestas:

149

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

  ...
   <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 maven con el ciperfil, es decirmvn -P ci clean install

Raghuram
fuente
44
Excelente respuesta! No sé por qué tuve tantos problemas para encontrar esto en los documentos de Maven. La única sugerencia que haría es que, dado que prefiero que las pruebas de integración se ejecuten de manera predeterminada, agregué activeByDefaultese perfil y luego tuve que agregar otro perfil vacío (por ejemplo skip-integration-tests) para poder omitirlos.
denishaskin
77
¿Hay alguna manera de hacer esto sin duplicar todas las cosas compartidas?
JonnyRaa
77
Tenga en cuenta que si usa el complemento maven-release parece que no actualiza el número de versión de submódulos que están ocultos detrás de un interruptor de perfil. Podría tener submódulos con diferentes números de versión para el resto de su proyecto ...
Ardesco
8
Desafortunadamente, al usar el perfil no puede excluir un módulo mencionado anteriormente en la parte principal de <modules> del pom. El JIRA issues.apache.org/jira/browse/MNG-5230 (y toda la estructura de pom) podría haberse implementado completamente mucho mejor con un poco más de cuidado.
Ed Randall el
2
¿Esta solución realmente funciona? Al menos no puedo hacer que funcione. Parece que tengo el mismo problema como @EdRandall
Gerros
232

Maven versión 3.2.1 agregó esta característica, puede usar el -plinterruptor ( acceso directo a la --projectslista) con !o -( fuente ) para excluir ciertos submódulos.

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

¡Ten cuidado al golpear al personaje! es un carácter especial, por lo que debe citarlo (como lo hice) o escapar con el carácter de barra diagonal inversa.

La sintaxis para excluir múltiples módulos es la misma que la inclusión

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

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

mvn -pl "!submodule1,!submodule2" install
Alexandre DuBreuil
fuente
27
Importante: si desea excluir un submódulo anidado, debe usar la versión calificadamvn -pl !com.acme:nestedmodule1
Leonard Brünings, del
3
La opción -pl necesita '[groupId]:' antes de artifactId, por lo que deberíamos usar mvn -pl '!: Submodule-to-exclude' install
Honsen
44
También puede usar mvn -pl '!path/to/submodule/directory', sin usar groupId y artifactId. Mi respuesta funciona si submodule1y submodule2se encuentran en el directorio actual.
Alexandre DuBreuil
También vale la pena nada de lo que si se utiliza -plen mvn install, es probable que necesite usarlo para mvn deployasí
majikman
39

Es posible decidir qué proyectos de reactor se construirán especificando el -plargumento de la línea de comando:

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

Acepta una lista de parámetros separados por comas en una de las siguientes formas:

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

Por lo tanto, dada la siguiente estructura:

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

Puede especificar la siguiente línea de comando:

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

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


EDITAR: como señaló blackbuild , a partir de Maven 3.2.1 tiene una nueva -elbandera que excluye proyectos del reactor, de manera similar a lo que -plhace:

skuro
fuente
2
Gracias. Esto funcionó bien para mí. También tenga en cuenta que puede agregar el "-am" (también conocido como "- también-make") para crear también los proyectos que requieren los módulos que ha especificado.
GaZ
1
¡Excelente! Solía mvn install -pl .instalar pom padre solo en el repositorio local sin construir módulos.
Marcin
Además, eche un vistazo a jira.codehaus.org/browse/MNG-5230 . Ahora puede excluir proyectos del reactor.
blackbuild
1
Enlace MNG-5230 desde que se cerró codehaus.org: issues.apache.org/jira/browse/MNG-5230
Ed Randall
Desafortunadamente, no funciona de forma transitiva, es decir, si tengo top / mod1 / mod2 y compilo desde arriba, -pl '! Mod2' genera un error.
zakmck
4

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

Supongamos que su proyecto está estructurado como:

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

El project-root/pom.xmldefine módulos

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

El ci/pom.xmldefine perfiles 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 dará lugar a Maven saltarse las pruebas de este módulo, excepto cuando el perfil de llamada CIestá activo. Se debe indicar a su servidor de CI que se ejecute mvn clean package -P CI. El sitio web de Maven tiene una explicación detallada del mecanismo de creación de perfiles .

Sri Sankaran
fuente
2

ahora hay (desde la versión 1.1.1) una bandera de 'saltar' en el hoyo.

Entonces puedes 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 saltará

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] Proyecto de omisión

twillouer
fuente