Подтвердить что ты не робот

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 в пути построения, но все же я не понимаю, почему он выдает мне вышеуказанную ошибку.

4b9b3361

Ответ 1

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


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

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

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


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

Ответ 2

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

Ответ 3

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

Apache-HTTP-клиентские банки также поставляются в той же категории, что и некоторые google-apis.

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Загрузите эту банку

Он разрешил мою проблему, это 1.7.

Ответ 7

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

Кодировать

Base64 ed = new Base64();

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

Замените "Hello" на текст, который будет закодирован в String Format.

Декодировать

Base64 ed = new Base64();

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

Здесь закодирована переменная String, подлежащая декодированию