Pregunta

Sé que es mauvais ton que pedir dos veces en un solo día, pero aquí hay otro puzzle de Maven:

Tengo un POM matriz que define 5 módulos (5 subproyectos). Puesto que cada módulo se ejecuta exactamente de la misma manera que me tire sección <profile><build> en el POM padres para deshacerse del código duplicado. Ahora - si ejecuto construir individualmente de cada módulo funciona, sin embargo, si quiero construir todos los módulos a la vez y mover al directorio padre que ha obtenido un error ya que la primera cosa Maven intenta ejecutar es el proyecto matriz misma:

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

Después de que la generación falla porque plugin de ejecución intenta ejecutar algo que no está allí. En cuanto a la salida que es bastante obvio que el plug-in del reactor está impulsando la construcción, pero ¿cómo puedo configurar reactor para saltar el padre?

P.S. Para evitar la confusión - Estoy tratando de suprimir la ejecución en el perfil de los padres y activarlo en los niños durante la construcción same

¿Fue útil?

Solución

¿Qué pasa por la construcción de la matriz?

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

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

La primera es una definición de todo lo que es común con todos los niños. Se define una matriz como un proyecto pom-envasados, y se puede instalar en su repositorio.

Cuando se construye un hijo de este padre, Maven2 recuperará este padre de fusionar el pom pom padre con el niño. Puede echar un vistazo a todo el pom.xml mediante la ejecución del comando mvn help:effective-pom.

En este caso, el pom padres no se construye, sólo se recuperará desde el repositorio.

El segundo caso es un proyecto que contiene una lista modules de sub-proyectos. El principio es que todos los comandos que se ejecuta en este proyecto también se llevará a cabo en todos los sub-módulos. El orden de los módulos será definido por el reactor, que se verá en las interrelaciones módulos de dependencias para encontrar qué módulo debe ser construido antes que los demás. Si no existen dependencias, entonces se toma la lista de los módulos tal como se definen en el pom.xml padres.

En este caso, si se ejecuta un comando en el proyecto raíz, Maven2 primero construido el proyecto de raíz, y luego los submódulos. no pueden omitir la creación de la raíz del proyecto.


Editar, gracias al comentario RichSeller

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

Otros consejos

No se puede omitir la generación de primario, 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 de la presencia o ausencia de un elemento <activation> basada en archivos. De esta manera se puede definir el perfil de los padres, pero lo tienen desactivado en ese proyecto porque el archivo de marcador de estar presente en la matriz. proyectos niño no tendrían el archivo marcador en su fuente, por lo que el perfil se activaría para esos proyectos.

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

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

Quiero documentar que no hay compromiso parcial con mi situación (gracias a los chicos en los usuarios de Maven lista para la sugerencia de correo). Básicamente lo que necesita para cortar el perfil en dos piezas. configuration sección reutilizable del plug-in va al POM padres, y executions se queda en el niño POM. A continuación, el plugin perfil en el niño se marca como inherited y listo - en tiempo de ejecución el perfil de los padres no se ejecuta ya que es la sección executions faltante. Esto está lejos de ser ideal pero funciona. Consulte a este enlace por ejemplo

Yo no era capaz de poner en práctica "perdido" solución de archivo de lo dispuesto por Rick Vendedor anteriormente. Parece que una vez establecido el estado activo / no activo de perfil no se cambia incluso el archivo marcador no se encuentra 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 entonces 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 opción de línea de comandos

mvn install –rf foo

Alternativamente, puede utilizar --resume-from Lo que hará es saltarse los padres y continúe desde el módulo foo abajo. Ahora - Estoy investigando si esto se puede lograr mediante la configuración de plug-in Reactor (P.S -. No, no se puede) , pero incluso con el interruptor, el escenario anterior funciona bien para mí

Esto se deduce de @ romaintaz de respuesta a la misma pregunta, Maven - skip los padres del proyecto de construcción

pero sólo para hacer esta explícita, en el padre del pom es imperativo que se especifica el elemento de embalaje como POM (y no frasco o la guerra).
Ejemplo:

<packaging>pom</packaging>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top