it-roy-ru.com

java.lang.NoSuchMethodError: org.Apache.commons.codec.binary.Base64.encodeBase64String () в приложении Java EE

Я разрабатываю приложение Java EE, в котором мне нужно Base64 кодирования/декодирования

Поэтому я добавил commons-codec-1.5.jar в папку WEB-INF/lib своего приложения и использовал 

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

в файле Java.

Во время компиляции, когда я набираю Base64, он показывает, что метод encodeBase64String доступен. Но во время выполнения он выдает исключение, подобное этому:

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

У меня есть JAR в buildpath, но я все еще не понимаю, почему он выдает мне вышеуказанную ошибку.

36
Sreeram

Этот метод был введен в кодексе Commons 1.4. Это исключение означает, что у вас есть более старая версия кодека Commons где-то еще в пути к классам во время выполнения веб-приложения, который имеет приоритет при загрузке классов. Проверьте все пути, указанные в classpath веб-приложения. Это включает, в частности, Webapp/WEB-INF/lib, YourAppServer/lib, JRE/lib и JRE/lib/ext. Наконец, удалите или обновите более раннюю версию.


Update: согласно комментариям, вы не можете найти его. Я могу только предложить закомментировать код с использованием этого более нового метода, а затем поставить следующую строку:

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

Это должно напечатать абсолютный путь к файлу JAR, куда он был загружен во время выполнения.


Update 2: похоже, это указывает на правильный файл. Извините, я не могу больше объяснить вашу проблему прямо сейчас. Все, что я могу предложить, - это использовать другой метод Base64, такой как encodeBase64(byte[]), а затем просто создать new String(bytes) самостоятельно. Или вы можете удалить эту библиотеку и использовать другой кодировщик Base64, например этот .

71
BalusC

@ Адам Августа прав, Еще одна вещь 

Клиентские jar-файлы Apache-HTTP также относятся к той же категории, что и некоторые google-apis.

org.Apache.httpcomponents.httpclient_4.2.jar и commons-codec-1.4.jar оба на пути к классам. Вполне возможно, что вы получите эту проблему.

Это доказано всем банкам, которые используют раннюю версию common-codec внутренне, и в то же время кто-то, использующий common-codec / явно в classpath .

6
pkm1986

Некоторые инструменты Google, такие как GWT, имеют встроенную версию commons-codec с классом Base64 до 1.4. Возможно, вам понадобится сделать JAR-файлы таких инструментов недоступными для вашего кода путем рефакторинга вашего проекта таким образом, чтобы только части кода, которым требуется этот инструмент, могли видеть зависимость.

5
Adam Augusta

Скачать это банка

Это решило мою проблему, это 1.7.

2
asifaftab87

Я столкнулся с той же проблемой с JBoss 4.2.3 GA при развертывании моего веб-приложения. Я решил проблему, скопировав мой jar-файл кодека commons-codec 1.6 в C:\jboss-4.2.3.GA\server\default\lib

1
Ktonneh

Вам нужна библиотека кодеков Apache Commons 1.4 или выше в вашем classpath . Эта библиотека содержит реализацию Base64.

1
Mikhail Tanaev

Попробуйте добавить 'commons-codec-1.8.jar' в вашу папку JRE!

0
Evandro Brunassi

Просто создайте объект Base64 и используйте его для кодирования или декодирования, используя org.Apache.commons.codec.binary.Base64 library

Кодировать

Base64 ed = новый Base64 ();

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

Замените «Hello» текстом для кодирования в формате String.

Расшифровать

Base64 ed = новый Base64 ();

String decoded = new String (ed.decode (encoded.getBytes ()));

Здесь закодирована строковая переменная для декодирования

0
Karan