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