Maven: cómo anular la dependencia agregada por una biblioteca

Aquí está mi problema genérico:

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 grupo y el artefacto. 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 error . 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 importe.

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 el POM de mi proyecto tengo la siguiente dependencia en “A”:

  org.apache.poi poi 3.6   org.apache.poi poi-ooxml 3.6  

Gracias por adelantado.

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

Forzar una versión
Siempre se respetará 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 afectará a otros poms aguas abajo si depende de la utilización de dependencias transitivas.


Recursos:

  • Mediación de Dependencia y Resolución de Conflictos
  • Introducción al Mecanismo de Dependencia

Alternativamente, 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 ligeramente 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 uno (a través de más dependencias transitivas) importó diferentes versiones de Stax. Entonces, en mi dependencia de ‘A’, excluí ambas versiones de Stax.

  a.group a.artifact a.version    stax-api javax.xml.stream   stax-api stax    

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)

Entonces, para el ejemplo stAX, se vería así:

  a.group a.artifact a.version    stax-api javax.xml.stream   stax-api stax     javax.xml.stream stax-api 1.0-2  

Lo que ponga dentro de la etiqueta de la raíz pom será incluido por todos los módulos secundarios de la 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 colocar la dependencia dentro de . Esto asegurará que cualquier módulo hijo 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 .

También puede usar para modificar la versión utilizada en las dependencias transitivas, ya que la versión declarada en el archivo pom superior es la que se usará. 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á comstackr con C v1.1).