Voici mon problème générique:
Mon projet P dépend de A qui dépend de B qui dépend de C qui dépend de la version 1.0.1 de D.
Il y a un problème avec la version 1.0.1 de D et je veux forcer l'utilisation d'un autre module. Je ne sais pas comment déclarer cela dans les POM de mon projet car je n'ai pas ajouté de dépendance à D directement. C'est C qui a déclaré la dépendance à D.
Important: dans ce cas, non seulement la version est modifiée, mais également le groupe et l'artefact. Il ne s'agit donc pas simplement de remplacer la version de la dépendance, mais d'exclure un module et d'en inclure un autre.
Dans le cas concret, D est StAX dont la 1.0.1 a un bug . Selon les notes du bogue, "les problèmes ont été résolus en remplaçant stax-api-1.0.1 (maven GroupId = stax) par stax-api-1.0-2 (maven GroupId = javax.xml.stream)", donc je 'essaye juste ça.
Ainsi, D = stax: stax-api: jar: 1.0.1 et C = org.Apache.xmlbeans: xmlbeans: jar: 2.3.0
J'utilise maven 2.0.9 au cas où cela serait important.
Sortie de la dépendance mvn: tree "
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
Dans le POM de mon projet, j'ai la dépendance suivante sur "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>
Merci d'avance.
Spécifiez simplement la version dans votre pom actuel. La version spécifiée ici remplacera autre.
Forcer une version
Une version sera toujours honorée si elle est déclarée dans le POM actuel avec une version particulière - il convient toutefois de noter que cela affectera également les autres poms en aval si elle dépend elle-même de l'utilisation de dépendances transitives.
Ressources:
Alternativement, vous pouvez simplement exclure la dépendance que vous ne voulez pas. STAX est inclus dans JDK 1.6. Par conséquent, si vous utilisez la version 1.6, vous pouvez simplement l’exclure.
Mon exemple ci-dessous est légèrement faux pour vous - vous n’avez besoin que de l’une des deux exclusions mais je ne sais pas trop laquelle. Il y a d'autres versions de Stax qui circulent, dans mon exemple ci-dessous, j'importais A, et B, ainsi que C & D, qui importaient différentes versions de Stax. Donc, dans ma dépendance à 'A', j'ai exclu les deux versions 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>
J'ai également eu du mal à annuler une dépendance dans une bibliothèque tierce. J'ai utilisé l'approche de scot avec l'exclusion mais j'ai aussi ajouté la dépendance avec la version la plus récente dans le pom. (J'ai utilisé Maven 3.3.3)
Donc, pour l'exemple stAX, cela ressemblerait à ceci:
<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>
Ce que vous mettez à l'intérieur du </dependencies>
La balise du pom racine sera incluse par tous les modules enfants du pom racine. Si tous vos modules utilisent cette dépendance, c'est la voie à suivre.
Cependant, si seulement 3 de vos modules enfants sur 10 utilisent une dépendance, vous ne souhaitez pas que cette dépendance soit incluse dans tous vos modules enfants. Dans ce cas, vous pouvez simplement mettre la dépendance dans le </dependencyManagement>
. Cela garantira que tout module enfant ayant besoin de la dépendance doit le déclarer dans son propre fichier pom, mais utilisera la même version de cette dépendance que celle spécifiée dans votre </dependencyManagement>
tag.
Vous pouvez aussi utiliser le </dependencyManagement>
pour modifier la version utilisée dans les dépendances transitives, car la version déclarée dans le fichier pom le plus haut est celle qui sera utilisée. Cela peut être utile si votre projet A inclut un projet externe B v1.0 qui inclut un autre projet externe C v1.0. Il arrive parfois qu'une faille de sécurité se trouve dans le projet C v1.0, qui est corrigée dans la v1.1, mais les développeurs de B mettent lentement à jour leur projet pour utiliser la v1.1 de C. Dans ce cas, vous pouvez simplement déclarer une dépendance sur C v1.1 dans le pom racine de votre projet dans `, et tout ira bien (en supposant que B v1.0 pourra toujours être compilé avec C v1.1).