2010-09-07 27 views
6

Mi proyecto está compuesto por 5 subproyectos. Una es una guerra, y las otras 4 son jarras. Básicamente, el proyecto de guerra necesita los 4 proyectos jar y sus dependencias.Cómo manejar las dependencias de subproyectos en Maven

Puedo quitar las dependencias para tener algo así como war-> A-> B-> C-> D. Cada proyecto secundario agrega su cuota de dependencias externas (resorte, puntales, hibernación) para que al final la guerra obtenga todo lo que necesita para ejecutarse.

Esto se ve muy bien organizado y cuadrado, pero luego me pregunto si esto es muy práctico para hacer cambios.

Imagine que tengo que cambiar una línea de código en el proyecto D, sin cambiar nada a sus dependencias Maven. Tendría que volver a lanzar el proyecto D obviamente, pero luego tengo que volver a lanzar los proyectos C, B, A y la guerra solo para reflejar este cambio en sus archivos pom. Esto puede ser largo y molesto, especialmente si tiene que lanzar rápidamente una nueva versión para arreglar algo en producción.

Podría hacer depender la guerra de los 4 proyectos, entonces solo tengo que cambiar el número de versión del proyecto D en el archivo pom de guerra. Pero luego tengo el proyecto A que depende indirectamente del proyecto D 1.0 y el proyecto que especifica la guerra D 1.1. Creo que la dependencia directa de la guerra ganaría en ese caso, ¿no?

Esto haría que el lanzamiento de la nueva guerra fuera más rápido, pero también arruinaría las dependencias de mis proyectos secundarios, ya que estarían desactualizados.

¿Cuál sería una forma aceptable de manejar esta situación?

Respuesta

3

No hay una respuesta sencilla a su problema.

Si realmente tiene una cadena de dependencias transitivas (A-> B-> C-> D), liberar cada uno de los módulos en la cadena de forma independiente no es una mala opción. Aunque es tedioso, hay una Es muy probable que sus dependencias anidadas sean simples jar de lib y no vean los cambios con demasiada frecuencia. Afortunadamente no se verá obligado a realizar ese proceso con frecuencia. Imagínese que sería la misma situación que si se actualiza log4j y todos sus modu les necesitaba ser actualizado también.

Otra cosa a considerar son las dependencias de su WAR. Sí, Maven instalará las dependencias automáticamente, pero a menudo es una buena práctica declarar explícitamente sus dependencias conocidas para que pueda especificar un número de versión para cada módulo. Esto significa que A depende de D y de los demás directamente. Lamentablemente, si tiene números de versión conflictivos, como ha descrito, entonces está buscando problemas en su ruta de clases. Si realmente necesita hacer esto, sin embargo, experta en sí permite que se excluya expresamente dependencias transitivas:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-B</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-C</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-C</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-D</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    ... 
</project> 

Aquí está la descripción de estas dependencias documentation y exclusiones opcionales.

¿De verdad necesita liberar B, C y D de forma independiente? Si no, considere usar un archivo Aggregator pom.xml en la raíz de sus módulos. Esto le permitirá usar las versiones de SNAPSHOT en sus módulos y luego liberar el grupo de una vez.Esta es la forma en que nuestro equipo administra nuestro proyecto de varios módulos. El uso de las dependencias de SNAPSHOT garantiza el uso de la versión que acaba de crearse cuando esos artefactos son necesarios.

+0

hola Gweebz. Gracias por la respuesta detallada. No es necesario que cada subproyecto se publique individualmente, por lo que le daré una buena mirada a este concepto de agregador que no conocía. Los módulos contienen todos los códigos comerciales y de datos, y están sujetos a cambios periódicos. Otra solución sería excluir las dependencias transitivas como dijiste, no pensé en eso. Gracias por la luz sobre esto. – IceGras

+0

Sin necesidad de liberar cada módulo de forma independiente, recomiendo usar la solución Aggregator. Su patrón es el ajuste perfecto para su escenario. Me alegro de poder ayudar :) –

1

¿Realmente liberas cualquiera de los proyectos A a D de forma independiente, sin la GUERRA? Si no, no veo ningún problema con su configuración actual. Debería absolutamente utilizar la misma versión de cualquier módulo a lo largo del proyecto. De lo contrario, se abre la puerta al infierno cargador de clases - me cree, usted no quiere llegar :-(

Para realizar cambios de forma más fácil, la maven-release-plugin puede ayudarle a

+0

Hola Péter. Los proyectos de A a D son específicos de WAR, pero tengo que liberarlos individualmente para que otros desarrolladores puedan compilar el WAR y el complemento de lanzamiento de Maven encuentre las dependencias. Tal vez estos lanzamientos no son necesarios? – IceGras

+0

@IceGras, aumentar el número de versión cada vez que realice un cambio puede ser excesivo. En nuestro proyecto, estamos contentos con las versiones de SNAPSHOT durante el tiempo de desarrollo, y creamos una nueva versión concreta solo para lanzamientos oficiales (candidatos). –

+0

Trabajar con instantáneas durante el tiempo de desarrollo parece ser la mejor solución, pero tengo esta pregunta: si libera RC1 con todos los módulos en la versión 1.0, y solo necesita cambiar el módulo C. Si suelta RC2, todos los demás proyectos aumentarán versión para nada entonces? También mi principal preocupación es sobre el cambio de producción. Si mi versión necesita ser cambiada, tendré que encontrar el número de todas las versiones para reflejar transitoriamente el cambio. – IceGras

1

La mejor respuesta estos días es ahora usar gradle que es lo mejor de hormigas y maven. Nunca me gustó mucho maven pero gradle tomó muchos de los conceptos comunes, pero lo hizo más como hormiga en que es flexible para que no haya una respuesta fácil a tu pregunta en gradle;).

Cuestiones relacionadas