java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String () в приложении Java EE - PullRequest
38 голосов
/ 07 октября 2011

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

Ответы [ 8 ]

73 голосов
/ 07 октября 2011

Этот метод был введен в Commons Codec 1.4.Это исключение означает, что у вас есть более старая версия кодека Commons где-то еще в пути к классам во время выполнения веб-приложения, который имеет приоритет при загрузке классов.Проверьте все пути, указанные в 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, например этот .

6 голосов
/ 09 мая 2013

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

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

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

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

6 голосов
/ 17 марта 2013

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

2 голосов
/ 04 ноября 2016

Скачать этот кувшин

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

1 голос
/ 24 мая 2016

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

1 голос
/ 12 августа 2013

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

0 голосов
/ 25 февраля 2019

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

0 голосов
/ 06 августа 2017

Просто создайте объект 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 ()));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...