Tengo un proyecto Maven multi-módulo con un proyecto principal P
y tres sub-módulos A
, B
y C
. Ambos B
y C
son proyectos de guerra y ambos dependen A
.
Puedo escribir mvn compile
en P
y 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 B
el 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
.
¿Tengo que correr
mvn package
para toda la jerarquía del proyecto cuando realmente solo quieroB
?¿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 A
todavía está en desarrollo activo.
¿Alguna mejor práctica aquí?
fuente
Respuestas:
Utilice las opciones avanzadas del reactor Maven , más específicamente:
Entonces, solo
cd
en el directorio P principal y ejecute:Y esto construirá B y los módulos requeridos por B.
Tenga en cuenta que debe usar dos puntos si hace referencia a uno
artifactId
que difiere del nombre del directorio:Como se describe aquí: https://stackoverflow.com/a/26439938/480894
fuente
mvn install -pl .,parent/child,parent/child/grandchild
Usar coma para separar múltiples proyectos y. para padres pomclean package
un módulo de esta manera, no puede resolver las dependencias del reactor que aún no están instaladas. Con-am
ello se reconstruirán innecesariamente los deps.Por ejemplo pom.xml Padres contiene 6 módulos y desea ejecutar una , B y F .
1- cd en proyecto padre
O
O
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.
fuente
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 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 / empacar el submódulo (B) y Maven tomará el ya empaquetado y dependencias instaladas a la perfección.Solo necesita un
mvn install
en el proyecto principal si actualizó alguna parte del código.fuente
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.
fuente
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
.fuente
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
-am
o-pl
como se describe en la respuesta aceptada. Si está utilizando una versión de maven anterior a v2.1, cámbiela primero :)fuente