new multi library example create maven skip parent-pom maven-reactor

library - spring boot maven multi module project example



Maven-omitir la construcción del proyecto padre (5)

Sé que es un montón de preguntas pedir dos veces en un solo día, pero aquí hay otro rompecabezas de Maven:

Tengo un POM principal que define 5 módulos (5 subproyectos). Dado que cada módulo se ejecuta exactamente de la misma manera, arrastro la sección <profile><build> en el POM principal para deshacerme del código duplicado. Ahora, si ejecuto la compilación individualmente desde cada módulo, funciona. Sin embargo, si quiero compilar todos los módulos a la vez y moverme al directorio principal, recibí un error, ya que la primera cosa que Maven intenta ejecutar es el proyecto principal:

mvn package -P release [INFO] Scanning for projects... [INFO] Reactor build order: [INFO] DWD Parent project [INFO] Projects

Después de que la compilación falla, el complemento exec intenta ejecutar algo que no está allí. En cuanto a la salida, es bastante obvio que el complemento del reactor está impulsando la compilación, pero ¿cómo puedo configurar el reactor para que omita al padre?

PS Para evitar confusiones: estoy intentando suprimir la ejecución del perfil en el padre y habilitarlo en el niño durante la same compilación


¿Qué está mal al construir el padre?

De hecho, en Maven, hay dos conceptos diferentes (que generalmente se usan al mismo tiempo):

  • El padre pom
  • La agregación de módulos.

La primera es una definición de todo lo que es común con todos los niños. Usted define un padre como un proyecto empaquetado con pom, y puede instalarlo en su repositorio.

Cuando construyes un hijo de este padre, Maven2 recuperará este padre para combinar el pom padre con el pom hijo. Puede echar un vistazo a todo el pom.xml ejecutando el comando mvn help:effective-pom .

En este caso, el pom principal no se construirá, solo se recuperará del repositorio.

El segundo caso es un proyecto que contiene una lista de modules de subproyectos. El principio es que cada comando que ejecute en este proyecto también se ejecutará en todos los submódulos. El orden de los módulos será definido por el Reactor, que analizará las dependencias entre módulos para encontrar qué módulo se debe construir antes que los otros. Si no hay dependencias, tomará la lista de los módulos tal como están definidos en el pom.xml principal.

En este caso, si ejecuta un comando en el proyecto raíz, Maven2 primero creará el proyecto raíz y luego los submódulos. No puede omitir la creación del proyecto raíz.

Editar, gracias al comentario de RichSeller.

Una explicación completa de las diferencias entre los múltiples módulos (proyecto de agregación) y la herencia (proyecto principal) se puede encontrar en el libro de Maven, here .


Esto está implícito en la respuesta de @ romaintaz a la misma pregunta, Maven: omitir la compilación del proyecto principal

pero solo para hacer esto explícito, en el pom principal es imperativo que especifique el elemento de empaquetado como pom (y no jar o war).
Ejemplo:

<packaging>pom</packaging>


No pude implementar la solución de archivo "faltante" según lo proporcionado anteriormente por Rick Seller. Parece que una vez que el estado de perfil activo / no activo no se modificará, incluso el archivo de marcador falta en el (los) módulo (s). Sin embargo, aquí está la solución exacta a mi problema. Advertencia: esto solo está disponible a partir de Maven 2.1+

Si tengo un POM principal con 2 módulos definidos: foo y boo, en circunstancias normales, el orden de ejecución será:

  1. padre
  2. foo
  3. abucheo

Todo lo que debo hacer para omitir la compilación principal es agregar este interruptor de línea de comando

mvn install –rf foo

Alternativamente, puede usar --resume-from Lo que hará es omitir a los padres y continuar desde el módulo foo hacia abajo. Ahora, estoy investigando si esto se puede lograr mediante la configuración del complemento Reactor (PS: no, no puedo), pero incluso con el interruptor, el escenario anterior funciona bien para mí


No puede omitir la compilación principal, pero puede configurar el perfil para que no se active con un pequeño truco. Esta respuesta muestra cómo controlar la activación de un perfil por la presencia o ausencia de un elemento <activation> basado en archivos. De esta manera, puede definir el perfil en el padre, pero desactivarlo en ese proyecto debido a que el archivo del marcador está presente en el padre. Los proyectos secundarios no tendrían el archivo del marcador en su fuente, por lo que el perfil se activaría para esos proyectos.

Actualizar para aclarar: en mi proyecto de prueba, esta configuración significa que el perfil está desactivado en el proyecto principal (que tiene el archivo en src / main / resources), pero se activa en todos los proyectos secundarios que no tienen el archivo en sus directorios de recursos.

<profile> <id>test</id> <activation> <file> <missing>src/main/resources/test.marker</missing> </file> </activation> ... </profile>


Quiero documentar que hay un compromiso parcial con mi situación (gracias a la lista de correo de los usuarios de maven por su sugerencia). Básicamente necesitas cortar el perfil en dos piezas. La sección de configuration reutilizable del complemento va al POM principal y las executions permanecen en el POM secundario. Luego, el complemento de perfil en el elemento secundario se marca como inherited y listo. En el tiempo de ejecución, el perfil principal no se ejecuta porque falta la sección de executions . Esto está lejos de ser ideal pero funciona. Consulte este enlace por ejemplo