Módulos Maven + Construyendo un Módulo Específico Único


384

Tengo un proyecto Maven multi-módulo con un proyecto principal Py tres sub-módulos A, By C. Ambos By Cson proyectos de guerra y ambos dependen A.

Puedo escribir mvn compileen Py tienen todos los sub-módulos compilados adecuadamente. El problema surge cuando quiero hacer operaciones para módulos específicos.

Me gustaría poder empaquetar una guerra por proyecto B, pero cuando ejecuto el comando del paquete desde Bel directorio de, se queja de que no puede encontrar las dependencias para A.

Entiendo de esta pregunta: Maven y los módulos dependientes que tal vez Maven no esté realmente diseñado para este tipo de resolución de dependencia, pero eso plantea la pregunta de cómo empaquetar B.

  1. ¿Tengo que correr mvn packagepara toda la jerarquía del proyecto cuando realmente solo quiero B?

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

Este segundo escenario no es muy divertido cuando Atodavía está en desarrollo activo.

¿Alguna mejor práctica aquí?


posible duplicado de Maven y módulos dependientes
oberlies

Respuestas:


696

¿Alguna mejor práctica aquí?

Utilice las opciones avanzadas del reactor Maven , 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

Entonces, solo cden el directorio P principal y ejecute:

mvn install -pl B -am

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

Tenga en cuenta que debe usar dos puntos si hace referencia a uno artifactIdque difiere del nombre del directorio:

mvn install -pl :B -am

Como se describe aquí: https://stackoverflow.com/a/26439938/480894


15
Para cualquiera que llegue a esta página en 2011, esta es la mejor respuesta. Ahora hay un mejor soporte para módulos múltiples dentro de Maven (Maven 2.1 y superior), no necesita usar el complemento del reactor.
Spedge

17
Otra opción muy útil es "-amd, - también-make-dependnts", que construye todos los módulos que dependen de proyectos en la lista de reactores.
determinar

1
¿Qué pasa con la construcción de un módulo nieto?
Bax

12
@Bax, use mvn install -pl .,parent/child,parent/child/grandchild Usar coma para separar múltiples proyectos y. para padres pom
Neo

1
Cuando intento clean packageun módulo de esta manera, no puede resolver las dependencias del reactor que aún no están instaladas. Con -amello se reconstruirán innecesariamente los deps.
Cuenca

18

Por ejemplo pom.xml Padres contiene 6 módulos y desea ejecutar una , B y F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd en proyecto padre

 mvn --projects A,B,F --also-make clean install

O

mvn -pl A,B,F -am clean install

O

mvn -pl A,B,F -amd clean install

Nota: Cuando especifique un proyecto con la opción -am , Maven construirá todos los proyectos de los que depende el proyecto especificado (ya sea directa o indirectamente). Maven examinará la lista de proyectos y recorrerá el árbol de dependencias, encontrando todos los proyectos que necesita construir.

Mientras que el comando -am hace que todos los proyectos requeridos por un proyecto en particular en una compilación de varios módulos, la opción -amd o - también-make-dependnts configure Maven para construir un proyecto y cualquier proyecto que dependa de ese proyecto. Al usar - también-make-dependnts , Maven examinará todos los proyectos en nuestro reactor para encontrar proyectos que dependan de un proyecto en particular. Construirá automáticamente esos proyectos y nada más.


8

Maven absolutamente fue diseñado 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.

Haga mvn installen 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 / empacar el submódulo (B) y Maven tomará el ya empaquetado y dependencias instaladas a la perfección.

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


3
Sería una pesadilla durante el desarrollo, imagen que una vez que realice una reparación en el submódulo, tendrá que instalarlo y luego iniciar el contenedor de servlets. La vida es corta :(
hguser

7

Si ya ha ejecutado mvn install en el proyecto B, se habrá instalado en su repositorio local, de modo que cuando cree el paquete A Maven podrá resolver la dependencia. Por lo tanto, siempre que instale el proyecto B cada vez que lo cambie, sus compilaciones para el proyecto A estarán actualizadas.

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

También vale la pena mencionar m2eclipse , integra Maven en Eclipse y le permite (opcionalmente) resolver dependencias del espacio de trabajo. Entonces, si está pirateando múltiples proyectos, el contenido del espacio de trabajo se usará para la compilación. Una vez que esté satisfecho con sus cambios, ejecute mvn install (en cada proyecto a su vez, o usando 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 objetivo? La jerarquía que tengo es en realidad mucho más compleja que la que se describe aquí, así que trate de recordar si ejecuté mvn install para cada proyecto dependiente desde la última vez que hice cambios en el código podría ser complicado.
Brian Ferris el

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

5

Echa un vistazo a mi respuesta Maven y los módulos dependientes .

El complemento Maven Reactor está diseñado para ocuparse de construir parte de un proyecto.

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


3
Esta solía ser la respuesta correcta, pero con Maven 2.1 ya no necesita usar el complemento del reactor. Mire la respuesta de Pascal en este hilo relacionado con "Opciones avanzadas del reactor"
Spedge

3

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

Entonces, a veces desea trabajar con A, B y C. Para este caso, tiene el proyecto agregador P. Para el caso en el que desea trabajar con A y B (pero no quiere C), debe crear el proyecto agregador Q .

Editar 2016 : la información anterior tal vez fue relevante en 2009. A partir de 2016, recomiendo ignorar esto en la mayoría de los casos, y simplemente usar las banderas de línea de comando -amo -plcomo se describe en la respuesta aceptada. Si está utilizando una versión de maven anterior a v2.1, cámbiela primero :)


Grmphh ... entonces terminaré con tantos proyectos agregadores como proyectos.
Kris

@Kris ya no recomendaría esto. Lo dejaré aquí en caso de que alguien todavía quiera saber cómo, pero siempre uso las banderas -am y -pl ahora. He actualizado mi respuesta.
Zac Thompson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.