2009-07-11 11 views
228

Tengo un proyecto Maven de varios módulos con un proyecto principal P y tres submódulos A, B y C. Ambos B y C son proyectos de guerra y ambos dependen de A.Maven Modules + Building a Single Specific Module

Puedo escribir mvn compile en P y tener todos los submódulos debidamente compilados. El problema surge cuando quiero hacer operaciones para módulos específicos.

Me gustaría ser capaz de empaquetar una guerra por el proyecto B, pero cuando ejecuto el comando de directorio de paquete B 's, que se queja de que no puede encontrar las dependencias de A.

Entiendo por esta pregunta: Maven and dependent modules que quizás Maven no está realmente diseñado para este tipo de resolución de dependencia, pero eso plantea la pregunta de ¿cómo puedo empaquetar B?

  1. ¿Tengo que correr mvn package para toda la jerarquía del proyecto cuando realmente sólo quiero B?

  2. ¿Tengo que instalar instantáneas de A en mi repositorio local cada vez que deseo empaquetar B?

Este segundo escenario no es muy divertido cuando A aún se encuentra en desarrollo activo.

¿Alguna de las mejores prácticas aquí?

+0

posible duplicado de [Maven y módulos dependientes] (http://stackoverflow.com/questions/808516/maven-and -dependent-modules) – oberlies

Respuesta

448

¿Alguna de las mejores prácticas aquí?

Uso del Maven advanced reactor options, más específicamente:

-pl, --projects 
     Build specified reactor projects instead of all projects 
-am, --also-make 
     If project list is specified, also build projects required by the list 

Así que cd en el directorio padre P y ejecute:

mvn install -pl B -am 

Y esto construirá B y los módulos requeridos por B

+12

Para cualquier persona que visite esta página en 2011, esta es la mejor respuesta. Ahora hay mejor soporte para múltiples módulos dentro de maven (Maven 2.1 y superior), no necesita usar el plugin de reactor. – Spedge

+14

Otra opción muy útil es "-amd, --also-make-dependdents", que crea todos los módulos que dependen de proyectos en la lista de reactores. – deterb

+0

¿Qué ocurre al construir un módulo de nieto? – Bax

6

Si ha ejecutado anteriormente mvn install en el proyecto B, se habrá instalado en su repositorio local, por lo que cuando compile el paquete, Maven puede resolver la dependencia. Por lo tanto, siempre que instale el proyecto B cada vez que lo modifique, sus compilaciones para el proyecto A estarán actualizadas.

Puede definir un proyecto de varios módulos con un agregador pom para crear un conjunto de proyectos.

También vale la pena mencionar m2eclipse, integra Maven en Eclipse y le permite (opcionalmente) resolver dependencias del área de trabajo. Entonces, si está pirateando proyectos múltiples, el contenido del área de trabajo se usará para la compilación. Una vez que esté satisfecho con sus cambios, ejecute mvn install (en cada proyecto sucesivamente, o use un agregador) para colocarlos en su repositorio local.

+1

¿Hay alguna manera fácil de garantizar que se hayan instalado todos los proyectos dependientes para mi proyecto de destino? La jerarquía que tengo es en realidad mucho más compleja que la que se describe aquí, así que trate de recordar si he ejecutado mvn install para cada proyecto dependiente ya que la última vez que hice cambios en el código podría ser complicado. –

+0

Sí, usando los módulos para construir el conjunto de proyectos, vea el enlace agregado a la respuesta original. –

+0

404 error o el enlace del proyecto de varios módulos. –

7

Maven fue diseñado absolutamente para este tipo de dependencia.

mvn package no instalará nada en su repositorio local solo empaqueta el proyecto y lo deja en la carpeta de destino.

Do mvn install en el proyecto principal (A), con esto todos los submódulos se instalarán en el repositorio Maven de su computadora, si no hay cambios solo necesita compilar/empaquetar el submódulo (B) y Maven tomará las dependencias ya empaquetadas e instaladas correctamente.

Solo necesita un mvn install en el proyecto principal si actualizó alguna parte del código.

+2

Sería una pesadilla durante el desarrollo, la imagen de que una vez que hagas una corrección en el módulo secundario, tendrás que instalarlo y luego iniciar el contenedor de servlets. La vida es corta :( – hguser

2

Usted dice que "realmente solo quiere B", pero esto es falso. Desea B, pero también desea una A actualizada si ha habido algún cambio ("desarrollo activo").

Por lo tanto, a veces se desea trabajar con A, B, y C. Para este caso se tienen proyecto agregador P. Para el caso en el que se desea trabajar con A y B (pero no quieren C), debe crear agregador proyecto P.

Edición 2016: La información anterior fue quizás relevante en 2009. a partir de 2016, le recomiendo haciendo caso omiso de esto en la mayoría de los casos, y el simple uso de los -am o -pl opciones de línea de comandos como descrito en la respuesta aceptada. Si está utilizando una versión de maven anterior a v2.1, cámbiela primero :)

+0

Grmphh ... luego terminaré con tantos proyectos de agregación como proyectos. – Kris

+0

@Kris Ya no lo recomendaría. Lo dejaré aquí en caso de que alguien todavía quiera saber cómo, pero Siempre uso los indicadores -am y -pl. He actualizado mi respuesta. –

5

Mire mi respuesta Maven and dependent modules.

El Maven Reactor plugin está diseñado para tratar la construcción de parte de un proyecto.

El objetivo particular que querrá usar es reactor:make.

+2

Esta solía ser la respuesta correcta, pero con Maven 2.1 ya no necesitas usar el plugin reactor. Mira la respuesta de Pascal en este hilo a "Opciones de Reactor Avanzado" – Spedge

Cuestiones relacionadas