2011-05-22 15 views
8

He buscado esa pregunta sin encontrar nada, así que aquí voy.Maven multi-module: agregue dependencias comunes en una sola?

Tengo un proyecto maven de varios módulos. Múltiples módulos heredan el mismo elemento primario, donde se definen las dependencias comunes. Entre ellos, hay uno mis propios módulos, uno 'común', donde se implementa una funcionalidad común.

Mi pregunta es: ¿Cuál sería una mejor práctica para las dependencias comunes: definirlas todas explícitamente en el padre, como lo hago actualmente? ¿O definirlos en un módulo 'común', que otros módulos hacen referencia, y luego confiar en la transitividad (como un punto de entrada único para dependencias comunes)?

Respuesta

14

Lo mejor es utilizar la etiqueta dependencyManagement en su pom padre para definir sus dependencias y sus versiones y luego hacer referencia a estas dependencias en sus submódulos donde sea necesario. Cuando requiera otros submódulos en su proyecto (es decir, su submódulo común de otro submódulo), las dependencias se encontrarán de manera transitiva. Por ejemplo:

En su pom padres:

<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

En su pom común (aviso no hay una versión o alcance):

<dependencies> 
    <dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    </dependency> 
</dependencies> 

Y a continuación, sólo puede hacer referencia al sub-módulo común a partir de otros submódulos ya estás.

+1

Tenga en cuenta que la gestión de la dependencia es viral, sin embargo. Es decir. si A -> B, A -> C: 1.0, y B -> C: 2.0 por medio de la administración de dependencias, entonces en el edificio A, obtendrás C: 2.0 en lugar de C: 1.0, como esperarías de un típico reglas de dependencia transitiva Para obtener la versión que desea, A debe usar la administración de dependencias para forzarla a C: 1.0. Por lo tanto: viral. –

+1

Sí, conozco la etiqueta dependencyManagement, pero la veo más como una forma de imponer las versiones de dependencias en un proyecto, sin redundancia proclive a errores. Sin embargo, aún necesita declarar las dependencias en cada módulo. Estaba pensando en una situación en la que ** todos los módulos ** (o casi) comparten alguna dependencia: independientemente de las versiones, ¿es una mejor práctica definir esas dependencias _global_ en el elemento primario (como lo hago actualmente) o crear un módulo para ese propósito específico, del cual todos los demás dependen? – Eleaar

+2

Utilizo dependencyManagagement como se describió anteriormente y coloco las dependencias de cada módulo dentro del nivel de módulo POM a menos que la dependencia sea para el 100% de los módulos siempre ... luego lo pongo en el POM padre. NO ponga una dependencia en el POM padre que no sea necesaria en todos los POM secundarios y definitivamente no cree un proyecto solo para obtener dependencias. No es gran cosa repetir estas dependencias en los módulos secundarios porque no es necesario que proporciones la versión, ya que la sección de dependencia de gestión en el elemento primario hace eso por ti. – HDave

0

Veo dos opciones razonables:

  • declaran dependencias comunes en un módulo común
  • Uso import scope

La segunda opción es útil cuando se tienen varios módulos dependen de la misma pila grande de componentes con número de sus propias dependencias.

Cuestiones relacionadas