2010-10-14 6 views
74

Aquí es mi problema genérico:Maven: cómo reemplazar la dependencia añadido por una biblioteca

Mi proyecto P depende de A que depende de B, que depende de C, que depende de la versión 1.0.1 de D.

Hay un problema con la versión 1.0.1 de D y quiero forzar el uso de otro módulo. No sé cómo declarar esto en los POM de mi proyecto ya que no he agregado una dependencia en D directamente. Es C que declaró la dependencia de D.

Importante: En este caso, no solo se cambia la versión, sino también el artefacto del grupo &. Por lo tanto, no se trata solo de anular la versión de la dependencia, sino más bien de excluir un módulo e incluir otro.

En el caso concreto, D es StAX cuyo 1.0.1 tiene un bug. De acuerdo con las notas en el error, "los problemas se resolvieron reemplazando el stax-api-1.0.1 (maven GroupId = stax) por stax-api-1.0-2 (maven GroupId = javax.xml.stream)" así que Estoy intentando eso.

Por lo tanto, D = stax: stax-api: jar: 1.0.1 y C = org.apache.xmlbeans: xmlbeans: jar: 2.3.0

estoy usando Maven 2.0.9 en caso de que asuntos.

salida de la dependencia mvn: Árbol"

mvn dependency:tree 
[..snip..] 
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile 
[INFO] | +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile 
[INFO] | | +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile 
[INFO] | | | \- stax:stax-api:jar:1.0.1:compile 

En POM de mi proyecto que tiene la siguiente dependencia de la "A":.

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.6</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.6</version> 
</dependency> 

Gracias de antemano

Respuesta

69

Simplemente especifique el versión en su pom actual. La versión especificada aquí anulará la otra.

Forzar una versión
siempre será honrado Una versión si se declara en el POM actual con una versión particular - sin embargo, debe tenerse en cuenta que esto también afecta a otros poms aguas abajo si es en sí dependía de usar transitiva dependencias.


Recursos:

+3

no está claro cómo puedo especificar la versión ya que no declaro una dependencia en D. Además, el primer enlace que proporcionó tiene "Este documento describe el resto de los requisitos para la administración de dependencias que aún NO se han implementado para Maven 2.0, especialmente en lo que respecta a las dependencias transitivas ". en la cima. – wishihadabettername

+0

@wishihadabettername, como se dijo en el otro documento: "Se podría agregar explícitamente una dependencia a D 2.0 en A para forzar el uso de D 2.0" –

+1

Usted realmente duplica la misma entrada en su propio pom. En su dependencia, especifique un que desee. Eso anulará cualquier versión utilizada por dependencias "más profundas". –

16

Como alternativa, sólo se puede excluir la dependencia que no desea. STAX está incluido en JDK 1.6, por lo que si está utilizando 1.6, puede excluirlo por completo.

Mi ejemplo a continuación es un poco incorrecto para usted; solo necesita una de las dos exclusiones, pero no estoy seguro de cuál. Hay otras versiones de Stax flotando, en mi ejemplo a continuación, estaba importando A que importó B que importó C & D, que cada una (a través de más dependencias transitivas) importó diferentes versiones de Stax. Entonces, en mi dependencia de 'A', excluí ambas versiones de Stax.

<dependency> 
    <groupId>a.group</groupId> 
    <artifactId>a.artifact</artifactId> 
    <version>a.version</version> 
    <exclusions> 
    <!-- STAX comes with Java 1.6 --> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>javax.xml.stream</groupId> 
    </exclusion> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>stax</groupId> 
    </exclusion> 
    </exclusions> 
<dependency> 
+0

Es necesario tener en cuenta que esta dependencia transitiva se puede utilizar y la exclusión puede causar un error de compilación si es necesario. –

+0

Si está utilizando un JDK moderno (es decir, 1.6+) y necesita la versión mucho más antigua de stax incluida a través de una dependencia transitiva, es probable que se encuentre con todo tipo de problemas con el cargador de la clase de tiempo de ejecución. Mi consejo: usa el que está en el JDK. Si obtienes una "falla de compilación", dependes de una antigua API de alguna forma que debería actualizarse. O bien: retrotrae tu JDK a 1.5. Buena suerte con eso. – scot

3

También tuve problemas para anular una dependencia en una biblioteca de terceros. Usé el enfoque de scot con la exclusión pero también agregué la dependencia con la versión más nueva en el pom. (Utilicé Maven 3.3.3)

Así que para el ejemplo Stax que se vería así:

<dependency> 
    <groupId>a.group</groupId> 
    <artifactId>a.artifact</artifactId> 
    <version>a.version</version> 
    <exclusions> 
    <!-- STAX comes with Java 1.6 --> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>javax.xml.stream</groupId> 
    </exclusion> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>stax</groupId> 
    </exclusion> 
    </exclusions> 
<dependency> 

<dependency> 
    <groupId>javax.xml.stream</groupId> 
    <artifactId>stax-api</artifactId> 
    <version>1.0-2</version> 
</dependency> 
0

Lo que se pone dentro de la etiqueta </dependencies> del pom de la raíz se incluirá por todos los módulos del niño raíz pom. Si todos sus módulos usan esa dependencia, este es el camino a seguir.

Sin embargo, si solo 3 de cada 10 de sus módulos secundarios usan alguna dependencia, no desea que esta dependencia se incluya en todos sus módulos secundarios. En ese caso, puede poner la dependencia dentro del </dependencyManagement>. Esto asegurará que cualquier módulo secundario que necesite la dependencia debe declararlo en su propio archivo pom, pero usarán la misma versión de esa dependencia como se especifica en su etiqueta </dependencyManagement>.

También puede usar el </dependencyManagement> para modificar la versión utilizada en las dependencias transitivas, ya que la versión declarada en el archivo superior pom es la que se utilizará. Esto puede ser útil si su proyecto A incluye un proyecto externo B v1.0 que incluye otro proyecto externo C v1.0. A veces sucede que se encuentra una violación de seguridad en el proyecto C v1.0 que se corrige en v1.1, pero los desarrolladores de B tardan en actualizar su proyecto para usar v1.1 de C. En ese caso, simplemente puede declarar una dependencia de C v1.1 en el pom raíz de su proyecto dentro de `, y todo estará bien (suponiendo que B v1.0 todavía podrá compilar con C v1.1).

Cuestiones relacionadas