web-dev-qa-db-fra.com

java.lang.NoSuchMethodError: org.Apache.commons.codec.binary.Base64.encodeBase64String () dans l'application Java EE

Je développe une application Java EE dans laquelle j'ai besoin du codage/décodage Base64

J'ai donc ajouté commons-codec-1.5.jar dans le dossier WEB-INF/lib de mon application et utilisé 

import org.Apache.commons.codec.binary.Base64;

dans le fichier Java.

Pendant la compilation, lorsque je tape Base64, il indique que la méthode encodeBase64String est disponible. Mais pendant l'exécution, une exception comme celle-ci est lancée:

Java.lang.NoSuchMethodError:org.Apache.commons.codec.binary.Base64.encodeBase64String

J'ai le fichier JAR dans le chemin de construction, mais je ne comprends toujours pas pourquoi il me renvoie l'erreur ci-dessus.

36
Sreeram

Cette méthode a été introduite dans le codec Commons 1.4. Cette exception indique que vous avez une ancienne version de Commons Codec ailleurs dans le chemin d'accès aux classes d'exécution de l'application Web, qui était prioritaire dans le chargement de classes. Vérifiez tous les chemins couverts par le classpath d'exécution de l'application Web. Ceci inclut entre autres les Webapp/WEB-INF/lib, YourAppServer/lib, JRE/lib et JRE/lib/ext. Enfin, supprimez ou mettez à niveau l'ancienne version incriminée.


Update: selon les commentaires, vous ne pouvez pas sembler le localiser. Je ne peux que suggérer de supprimer le code en utilisant cette méthode plus récente, puis de mettre en place la ligne suivante:

System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());

Cela devrait afficher le chemin absolu du fichier JAR à partir duquel il a été chargé lors de l'exécution.


Update 2: cela semblait pointer vers le bon fichier. Désolé, je ne peux plus expliquer votre problème maintenant. Tout ce que je peux suggérer est d'utiliser une méthode Base64 différente, telle que encodeBase64(byte[]), puis de construire vous-même une new String(bytes). Vous pouvez également supprimer cette bibliothèque et utiliser un autre encodeur Base64, par exemple celui-ci .

71
BalusC

@Adam Augusta a raison, encore une chose 

Les fichiers client Apache-HTTP appartiennent également à la même catégorie que certains google-apis.

org.Apache.httpcomponents.httpclient_4.2.jar et commons-codec-1.4.jar les deux sur le chemin d'accès aux classes, il est très possible que vous rencontriez ce problème.

Cela prouve à tous les fichiers qui utilisent la version précédente de common-codec en interne et en même temps, quelqu'un utilisant common-codec explicitement sur classpath too.

6
pkm1986

Certains outils Google, tels que GWT, intègrent une version intégrée de commons-codec avec une classe antérieure à 1.4 Base64. Vous devrez peut-être rendre ces fichiers JAR d'outils inaccessibles à votre code en restructurant votre projet de sorte que seules les parties de votre code ayant besoin de cet outil puissent voir la dépendance.

5
Adam Augusta

Télécharger ce pot

Cela a résolu mon problème, c'est 1.7.

2
asifaftab87

J'ai rencontré le même problème avec JBoss 4.2.3 GA lors du déploiement de mon application Web. J'ai résolu le problème en copiant mon fichier jar commons-codec 1.6 dans C:\jboss-4.2.3.GA\server\default\lib

1
Ktonneh

Vous avez besoin de la bibliothèque Apache Commons Codec 1.4 ou supérieure dans votre chemin de classe . Cette bibliothèque contient l’implémentation Base64.

1
Mikhail Tanaev

Essayez d'ajouter «commons-codec-1.8.jar» dans votre dossier JRE!

0
Evandro Brunassi

Créez simplement un objet de Base64 et utilisez-le pour encoder ou décoder, lorsque vous utilisez org.Apache.commons.codec.binary.Base64 library

Pour encoder

Base64 ed = nouveau Base64 ();

String encoded = new String (ed.encode ("Hello" .getBytes ()));

Remplacez "Hello" par le texte à encoder au format String.

Décoder

Base64 ed = nouveau Base64 ();

Chaîne décodée = nouvelle chaîne (ed.decode (encoded.getBytes ()));

Ici est encodée la variable String à décoder

0
Karan