Le CLASSPATH est un peu le péché originel de Java. Il poursuit tout développeur, du débutant qui ne comprend pas pourquoi l'interpréteur ne trouve pas les classes qu'il vient de compiler, au développeur chevronné qui doit se battre avec Maven et ses règles tortueuses de gestion des dépendances (surtout si elles sont transitives)… Au final, souvent on ne sait plus très bien ce qui se trouve dans son CLASSPATH et il peut alors survenir des erreurs très difficiles à corriger.
Une de ces sources d'erreurs est la présence de classes en versions différentes dans plusieurs fichiers JAR du CLASSPATH. Supposons par exemple que vous déclariez une dépendance aux bibliothèques Apache commons-collections et commons-beanutils (en versions 3.2.1 et 1.8.0 par exemple). Si ces deux dépendances se trouvent dans le même CLASSPATH, il y a une collision entre des classes Java des deux archives : par exemple on trouve dans ces JARs deux versions différentes de la classe org.apache.commons.collections.Buffer.
J'ai écrit un outil permettant de détecter ce type d'erreur. On lui passe les fichiers JAR à analyser sur la ligne de commande et il produit un rapport sur ce CLASSPATH en indiquant les collisions en terme de classes, de packages ou de fichiers JAR (rapport par défaut). Par exemple, pour vérifier les deux JARs cités ci-dessus, on se placera dans le répertoire des archives et on tapera :
$ cpc *.jar
Loading commons-beanutils-1.8.0.jar
Loading commons-collections-3.2.1.jar
Class overlap in jar files:
- commons-beanutils-1.8.0.jar
- commons-collections-3.2.1.jar
ERROR
|
Le script indique les archives en collision et indique une erreur et renvoie une valeur d'erreur à l'appelant.
On peut télécharger ce script Python à cette adresse.
Enjoy!
|