2009-10-01 12 views
18

sé que es mauvais ton que pedir dos veces en un solo día, pero aquí hay otro puzzle de Maven:Maven - skip proyecto principal construir

Tengo un POM matriz que define 5 módulos (5 subproyectos). Como cada módulo se ejecuta exactamente de la misma manera, selecciono la sección <profile><build> en el POM principal para eliminar el código duplicado. Ahora bien, 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 padre, recibo un error ya que lo primero 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 construcción falla porque el complemento exec intenta ejecutar algo que no está allí. Mirando la salida, es bastante obvio que el plugin reactor está impulsando la construcción, pero ¿cómo puedo configurar reactor para omitir el padre?

P.S. Para evitar confusiones: estoy intentando suprimir la ejecución del perfil en el elemento primario y habilitarlo en el elemento secundario durante la compilación same

+0

En resumen: experto carece de soporte para la composición, no es posible si sólo se construye a partir de los padres – sibidiba

Respuesta

9

¿Qué problema tiene construir el padre?

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

  • El POM padre
  • La módulos de agregación

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

Cuando crea un elemento secundario de este elemento primario, Maven2 recuperará este elemento primario para fusionar el elemento primario con el elemento secundario pom. Puede echar un vistazo a todo el pom.xml ejecutando el comando mvn help:effective-pom.

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

El segundo caso es un proyecto que contiene una lista de subproyectos modules. 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 intermódulos para encontrar qué módulo debe construirse antes que los demás. 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 creará primero el proyecto raíz y luego los submódulos. Usted no puede omita la creación del proyecto raíz.


edición, gracias al comentario RichSeller

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

+0

+1 para señalar eso, consulte el libro de Maven para más detalles: http://www.sonatype.com/books/maven-book/reference/ pom-relationships-sect-multi-vs-inherit.html –

+0

Sí, quería señalar esto porque, en general, la gente piensa que la agregación y el proyecto principal son lo mismo y no se pueden usar por separado. – romaintaz

+2

¿Qué hay de malo con la construcción del padre? Simple: lo que sucede en el perfil es aplicable a los niños, pero no tiene sentido para los padres. Para su punto, necesito ambos: agregación y capacidad para extraer el código reutilizable. Activación del perfil: según lo comentó Rich Seller es la solución perfecta – Bostone

14

No se puede omitir la compilación principal, pero puede configurar el perfil para que no se active con un pequeño truco . This answer muestra cómo controlar la activación de un perfil por la presencia o ausencia de un elemento <activation> basado en archivos. De esta forma, puede definir el perfil en el elemento principal, pero lo tiene desactivado en ese proyecto debido a que el archivo marcador está presente en el elemento primario. Los proyectos secundarios no tienen el archivo marcador en su fuente, por lo que el perfil se activará para esos proyectos.

Actualización 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 activado en todos los proyectos secundarios que no tienen el archivo en su directorios de recursos.

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

Rich - Esa es la respuesta que quiero! Para los puntos de romanitaz, quiero ambos: agregación y capacidad para extraer código común para el padre (para quien ejecutar ese código no tiene sentido). – Bostone

+0

Rico, si puedo molestarte un poco más. Estoy tratando de lograr el mismo efecto utilizando propiedades en lugar de archivos perdidos. No funciona Incluso cuando guardo la declaración de propiedad en el POM de mi hijo, mi perfil nunca se activa. ¿Porqué es eso? ¿Las propiedades se declaran "preconstruidas" y nunca se reinician?Tal vez debería hacer otra pregunta para poder poner un ejemplo de código. – Bostone

+0

No, debería activarse en función de la presencia de la propiedad (hay un ejemplo en http://maven.apache.org/guides/introduction/introduction-to-profiles.html), no dude en hacer otra pregunta si no puede obtener funciona –

4

Quiero documentar que hay un compromiso parcial con mi situación (gracias a los muchachos en la lista de correo de los usuarios de maven por la sugerencia). Básicamente, necesitas cortar el perfil en dos partes. La sección del plugin reutilizable configuration va al POM principal, y executions permanece en el POM hijo. A continuación, el complemento de perfil en el elemento secundario está marcado como inherited y listo: en tiempo de ejecución, el perfil principal no se ejecuta porque falta la sección executions. Esto está lejos de ser ideal pero funciona. Consulte to this link por ejemplo

+0

Interesante, gracias por publicar esto aquí. Sin embargo, ¿funciona el enlace o soy solo yo? –

+0

Funciona para mí, pero puede probar la versión completa http://mail-archives.apache.org/mod_mbox/maven-users/200812.mbox/%[email protected]%3E – Bostone

+0

La versión completa funciona, no el acortar. Gracias. –

2

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

Si tengo un POM padre con 2 módulos definidos: foo y Boo continuación, en circunstancias normales orden de ejecución será:

  1. padres
  2. foo
  3. boo

Todo lo que necesito hacer para saltar compilación principal es añadir esta línea de comando interruptor

mvn install –rf foo

Como alternativa, puede usar --resume-from Lo que hará es saltear el elemento primario y continuar desde el módulo foo hacia abajo. Ahora - Estoy investigando si esto se puede lograr mediante la configuración del reactor complemento (PS - no, no puede) pero incluso con el interruptor, el escenario anterior funciona bien para mí

1

Esto se deduce de la respuesta de @ romaintaz a la misma pregunta, Maven - skip parent project build

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

<packaging>pom</packaging> 
Cuestiones relacionadas