2012-03-21 16 views
15

Acabo de experimentar un caso de dos dependencias directas de mi proyecto maven que tiene dos versiones diferentes de una dependencia transitiva particular.Maven - Detectar múltiples versiones de la misma dependencia

En mi caso particular tuve dependencias directas sobre lo siguiente:

<dependency> 
     <groupId>org.jclouds.driver</groupId> 
     <artifactId>jclouds-sshj</artifactId> 
     <version>${jclouds.version}</version> 
    </dependency> 

y

<dependency> 
     <groupId>org.mule.modules</groupId> 
     <artifactId>mule-module-jersey</artifactId> 
     <version>${mule.version}</version> 
    </dependency> 

Ambas dependencias tenían un (profundidad) en dependencia transitiva com.sun.jersey: Jersey -core, pero con diferentes versiones para cada uno. Maven no falló en esto ni siquiera advirtió (o si lo hizo, ¡nunca lo vi!) Que tal cosa estaba sucediendo ... y como tal, nunca me di cuenta hasta que desapareció un problema que ocurrió cuando la versión de jersey- núcleo provocado por la dependencia jclouds causó algunas cosas para romper.

¿Existe un plugin maven o alguna otra herramienta que exista que detecte este tipo de cancelación de dependencia transitiva profunda y al menos advierta al usuario (o falle la ejecución del experto) si detecta tal colisión ... incluso si el el comportamiento predeterminado de maven es simplemente elegir la primera versión que aparece al resolver dependencias?

Respuesta

24

Utilice el complemento Dependency Enforcer. Se detendrá la construcción cuando las dependencias no convergen adecuadamente.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.0.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <DependencyConvergence /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

esto parece ser exactamente lo que estaba buscando. No pensé en consultar el plugin de enforcer para esto. – whaley

3

podría ejecutar depenency informe o utilizar árbol de dependencia: dependencia

mvn: Árbol -Dverbose -Dincludes = Commons-colecciones

2

Se podía echar un vistazo a su visión general dependency hiercharchy. Esto no lo advertirá, pero puede ver si se descartan ciertas versiones para las versiones más recientes de la misma biblioteca.

+0

¿se refiere a la ejecución de la dependencia: árbol con verbose especificado como @DmitryB sugerido? – whaley

1

Puede resolver el conflicto de versión excluyendo la versión no deseada de la dependencia adecuada. Por ejemplo:

<dependency> 
    <groupId>org.jclouds.driver</groupId> 
    <artifactId>jclouds-sshj</artifactId> 
    <version>${jclouds.version}</version> 
    <exclusions> 
     <exclusion> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

O añadir com.sun.jersey: Jersey-núcleo con la versión deseada a sus dependencias. Maven resuelve los conflictos de versión al admitir la dependencia más cercana a la raíz de las dependencias.

+0

Sé cómo resolver el problema. Lo que quiero es que Maven me diga que hay un problema * potencial * para empezar. – whaley

4

@Clement P le ha dado una respuesta perfectamente buena. Sin embargo, tenga en cuenta que puede ser insuficiente para proyectos de varios módulos.

El objetivo de depedndencyconvergence de enforcer plugin sabe cómo detectar colisiones de dependencia transitiva, pero una colisión puede ocultarse de una manera diferente.

Supongamos que tiene un proyecto de varios módulos. Root es A y tiene 2 submódulos, B1 y B2.

B1 declara una dependencia de artefacto a: b: c:1,1, mientras que B2 declara una dependencia de artefacto a: b: c:2,0

En este caso, si ambos los módulos se crean y despliegan con sus dependencias; tendrá una colisión, pero es un tipo que el complemento de enforcer no sabe cómo detectar.Dado que el proyecto A no depende (no puede) de sus submódulos.

Para superar este problema en nuestra organización, utilizamos el plugin de dependencia: lista y analizamos su salida de forma manual.

Descripción aproximada del proceso: El resultado de ejecutar este objetivo es una lista de todas las dependencias transitivas de todos los proyectos en la jerarquía del proyecto. Luego de analizar el resultado, ordenamos las dependencias y buscamos solo aquellos artefactos que difieren solo por el ID de la versión. Esto requiere algunos scripts en su entorno de CI, pero es la única manera de obtener ahora la imagen general.