2017-01-19 2 views
1

Je reçois l'exception suivante dans mon application web:java.lang.NoMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString

java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError:  org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString([B)Ljava/lang/String; 

Le commons-codec-1.5.jar est ajouté dans mon classpath. Je le construis en utilisant Ant et ai ajouté les dépendances manuellement. Grâce à d'autres discussions sur le même sujet, j'ai découvert que l'ajout de la source de cette bibliothèque peut résoudre le problème, mais cela n'a pas fonctionné pour moi. J'ai également lu qu'avoir une autre bibliothèque avec la même classe peut causer le conflit et peut-être que cette classe peut ne pas avoir cette méthode qui a comme conséquence l'erreur. Cependant, j'ai vérifié qu'il n'y a pas d'autre version de la même bibliothèque. Est-il possible qu'une autre bibliothèque ait la même classe? Si oui, comment puis-je identifier cela et résoudre le problème?

Répondre

2

Comme vous l'avez fait allusion dans votre question, cela est dû lorsqu'une version différente de la classe Base64 est utilisée au moment de la compilation à celle récupérée au moment de l'exécution. Puisque vous utilisez Ant (plutôt que Maven par exemple), il devrait être plus facile de trouver le coupable puisque vous n'avez pas à vous soucier des dépendances transitives. La première chose à faire est d'utiliser votre IDE pour ouvrir la classe Base64 (ctrl + N dans IntelliJ), cela mettra en évidence le nombre de versions différentes de cette bibliothèque sur votre classpath. Dans mon cas, il y en avait 2. Si vous en avez plus d'un alors vous avez trouvé votre coupable.

Si vous n'avez qu'une version sur votre chemin de classe, alors le seul autre endroit où cette classe peut résider est dans le répertoire lib de Tomcat. Vous devrez peut-être ouvrir manuellement les fichiers jar pour voir s'ils contiennent le même paquet org.apache.commons.codec.binary....

+0

Merci beaucoup @StuPointerException J'ai été capable de trouver le même paquet dans le fichier csrfguard jar. Mais le fichier csrfguard contient une version plus récente - 1.9 du fichier common-codec jar et a la méthode encodeBase64URLSafeString() pour laquelle j'obtiens le NoSuchMethodError. Mon pot est de la version 1.5 qui a aussi la méthode. Est-ce que cela cause vraiment le problème? –

+0

Etrange, en regardant l'API, la méthode a été ajoutée en 1.4 et la signature n'a pas changé depuis, donc je ne pense pas. – StuPointerException

+0

Je n'ai pas pu trouver la cause première de ce problème. Cependant, j'ai résolu le problème en ajoutant le code source pour le codec-commons dans mon projet. Ainsi, lorsque la guerre est emballée, les fichiers de classe pour Base64 seront dans les classes WEB-INF \. Le chargeur de classe va scanner cet emplacement avant WEB-INF \ lib et ainsi éviter le conflit dû aux pots. –