Tenemos un proyecto de 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" requiere mucho tiempo de construcción y queremos excluirlo cuando el proyecto es construido por un servidor CI. Actualmente utilizamos dos archivos pom.xml para lograr esto. Uno tiene todos los módulos y el otro tiene todos los módulos excepto los que se pueden dejar fuera para CI. Pero eso es bastante molesto porque a veces nos olvidamos de poner un nuevo módulo en ambos archivos.
¿Existe una solución que no necesite dos listas de módulos independientes?
Con Maven 3.2.1, ahora puede usar
-pl !<module_name>,!<module_name>
para excluir ciertos módulos de la construcción del reactor.Vea esta solicitud de función: https://issues.apache.org/jira/browse/MNG-5230
fuente
-
lugar de!
, es decir-pl -<module_name>
Los proyectos a 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 haya un nuevo módulo.
Quizás una combinación de esta bandera y /
--also-make-dependents
o--also-make
reduciría esta carga de mantenimiento nuevamente.fuente
mvn clean install -pl mysubproject
Supongo que desea que la compilación predeterminada siempre compile todo, independientemente de la velocidad, para que los nuevos desarrolladores puedan comenzar rápidamente sin tener que comprender mucho sobre el POM. Puedes usar perfiles como este:
El problema con esto es que si un desarrollador especifica otro perfil en la línea de comandos,
expensive-modules-to-build
no se incluye (a menos que el desarrollador también lo especifique). Esto hace que sea complicado recordar qué perfiles deben incluirse.Aquí hay una forma hacker de eso. Ambos perfiles siempre se incluyen, porque el archivo pom.xml siempre existe. Entonces, para excluir los costosos módulos, puede usarlos
-P!full-build
en la línea de comando.fuente
-pl !<module_name>,!<module_name>
es mejor que esta anteriorOtra idea: los módulos Reactor se pueden anidar, por lo que debería ser posible agrupar los módulos de construcción rápida y lenta en poms separados y luego agregar otro pom agregador que contenga estos dos como módulos. Su servidor CI solo podría hacer referencia al pom que contiene los módulos de construcción rápida.
fuente
Podría utilizar perfiles de maven . En nuestro entorno de compilación, creamos un perfil
quick
que deshabilita muchos complementos y la ejecución de pruebas.Esto es hecho por
Y luego invocamos a maven de la siguiente manera
Quizás podría deshabilitar la compilación y otros complementos estándar en el pom de su módulo para acelerarlo.
fuente
No es exactamente la respuesta que esta gente estaba pidiendo. Mi situación era que quería implementar solo el pom principal. Estoy usando el
spring-boot-thin-layout
módulo en un niño. Esto requiere que el módulo principal se implemente en artifactory. Agregué lo siguiente a mi proyecto. Permite saltar deinstall
y / odeploy
fase.En mi padre pom:
Y en los pom (s) de mi hijo o cualquier módulo que no desee implementar con el padre:
Entonces, efectivamente, cuando ejecuto
mvn deploy
en el pom principal, compilará todos los módulos, no ejecutará la instalación en nada, y luego, al final, implementará cualquier módulo que no tenga<maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
en sus propiedades. Entonces, en mi caso, solo implementando el padre.fuente