web-dev-qa-db-fra.com

Maven - Version multiple de la même dépendance

J'ai une application web dans laquelle les dépendances tirent dans deux pots appelés:

  1. javassist-3.9.0.GA.jar
  2. javassist-3.20.0-GA.jar

lorsque je conditionne le WAR, j'ai ces deux dans le répertoire WEB-INF/lib, ma question est que l'application est en cours d'exécution et pourquoi je n'obtiendrai aucun problème car apparemment j'ai les mêmes classes dans les deux pots et il devrait y avoir des problèmes droite?

14
Toseef Zafar

Pour Java peu importe le nombre de versions d'une classe que vous fournissez. Le chargeur de classe par défaut choisira simplement la première sur le chemin de classe qu'il peut trouver.

Étant donné que vous pouvez exécuter l'application sans erreur, cela signifie l'une des choses suivantes:

  • si javassist-3.9.0.GA.jar est le premier sur le chemin de classe: votre application ne repose pas sur de nouvelles API ou corrections de bogues dans javassist-3.20.0-GA.jar Aucune API que vous avez utilisée de cette bibliothèque n'a également changé entre ces versions ( qu'une bibliothèque ne devrait pas faire entre les versions mineures)

  • si javassist-3.20.0-GA.jar est le premier sur le chemin de classe: la bibliothèque est rétrocompatible

Je suggère:

  • Si ces dépendances sont des dépendances directes dans différentes parties de votre application, assurez-vous d'utiliser partout la même version. La meilleure façon consiste à corriger la version dans la section dependencyManagement du parent POM, puis à omettre l'attribut version dans les sections de dépendances.
  • Si ces dépendances sont des dépendances transitives, excluez celle que vous ne souhaitez pas utiliser pour vous assurer que vous n'avez qu'une seule version de la bibliothèque dans votre application finale. Pensez également à signaler un problème pour le projet qui utilise toujours l'ancienne version et demandez-leur de mettre à niveau la version de la dépendance.
  • Si vous devez travailler avec deux versions incompatibles de la même bibliothèque, qui ont les mêmes noms de package et de classe, envisagez d'utiliser un système de modules tel que OSGi, qui prend en charge l'exécution de différentes versions de la même bibliothèque dans une certaine mesure.
22
Puce

Répondre à "des suggestions sur la façon de résoudre ce problème?" jetez un oeil à Résolution des conflits en utilisant l'arbre de dépendance . Avec la commande mvn dependency:tree vous pourrez savoir d'où vient toute dépendance. Lorsque vous savez quels artefacts dépendent de javassist, vous pouvez ajouter une entrée d'exclusion pour éviter l'une des versions de javassist.

4
polypiel