maven-2 - introduccion - mvn clean install que es
¿Cómo excluir un módulo de una construcción de reactor Maven? (6)
Tenemos un proyecto Maven 2 con muchos módulos. Ejemplo:
<modules>
<module>common</module>
<module>foo</module>
<module>data</module>
<module>bar</module>
... more ...
</module>
Digamos que el módulo de "datos" lleva mucho tiempo construir y queremos excluirlo cuando el proyecto es creado por un servidor de CI. Actualmente usamos dos archivos pom.xml para lograr esto. Uno tiene todos los módulos y el otro tiene todos los módulos, excepto los que pueden dejarse para CI. Pero eso es bastante molesto porque a veces olvidamos poner un nuevo módulo en ambos archivos.
¿Hay una solución que no necesita dos listas de módulos por separado?
Con Maven 3.2.1, ahora puede usar -pl !<module_name>,!<module_name>
para excluir ciertos módulos de la compilación del reactor.
Vea esta solicitud de función: https://jira.codehaus.org/browse/MNG-5230
Lo más fácil podría ser usar profiles
como este:
<project>
...
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
<modules>
...
<profiles>
<profile>
<id>expensive-modules-to-build</id>
<modules>
<module>data</module>
</modules>
</profile>
</profiles>
</project>
Debería verificar formas en que puede activar perfiles
Los proyectos para construir también se pueden especificar en la línea de comando mvn. Esto eliminaría la necesidad de un pom separado, pero en su lugar tendría que cambiar la configuración de CI cada vez que hay un nuevo módulo.
-pl,--projects <arg> Comma-delimited list of specified
reactor projects to build instead
of all projects. A project can be
specified by [groupId]:artifactId
or by its relative path.
Tal vez una combinación de esta bandera y --also-make-dependents
o - --also-make
reduciría nuevamente esta carga de mantenimiento.
-am,--also-make If project list is specified, also
build projects required by the
list
-amd,--also-make-dependents If project list is specified, also
build projects that depend on
projects on the list
Otra idea: los módulos Reactor se pueden anidar, por lo que debería ser posible agrupar los módulos rápidos y de construcción lenta en poms separados y luego agregar otro agregador pom que contenga estos dos módulos. Su servidor CI solo podría hacer referencia al pom que contiene los módulos de construcción rápida.
<artifactId>fast</artifactId>
<modules>
<module>fast-a</module>
<module>fast-b</module>
<module>fast-c</module>
</module>
<artifactId>all</artifactId>
<modules>
<module>fast</module>
<module>slow</module>
</module>
Podrías usar profiles maven. En nuestro entorno de compilación, creamos un perfil quick
que deshabilita muchos complementos y ejecuta la prueba.
Esto es hecho por
<profile>
<id>quick</id>
<properties>
<skipTests>true</skipTests>
<!-- others... -->
</properties>
<build>
<plugins>
<!-- configuration... -->
</plugins>
</build>
</profile>
Y luego invocamos a maven de la siguiente manera
mvn groupId:artifactId:goal -P quick
Tal vez pueda deshabilitar la compilación y otros complementos estándar en el pom de su módulo para acelerarlo.
Supongo que quieres que la compilación predeterminada siempre genere todo, independientemente de la velocidad, para que los nuevos desarrolladores puedan comenzar rápidamente sin tener que entender mucho sobre el POM. Puede usar perfiles como este:
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
</modules>
...
<profiles>
<profile>
<id>expensive-modules-to-build</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>data</module>
</modules>
</profile>
</profiles>
</project>
El problema con esto es que si un desarrollador especifica otro perfil en la línea de comando, entonces el expensive-modules-to-build
no está incluido (a menos que el desarrollador también lo especifique). Esto hace que sea complicado recordar qué perfiles deben incluirse.
Aquí hay un truco de eso. Ambos perfiles están siempre incluidos, porque el archivo pom.xml siempre existe. Entonces, para excluir los costosos módulos, puede usar -P!full-build
en la línea de comando.
<profiles>
<profile>
<id>full-build</id>
<activation>
<file>
<exists>pom.xml</exists>
</file>
</activation>
<modules>
<module>data</module>
</modules>
</profile>
<profile>
<id>short-build</id>
<activation>
<file>
<exists>pom.xml</exists>
</file>
</activation>
<modules>
<module>common</module>
<module>foo</module>
<module>bar</module>
</modules>
</profile>
</profiles>