Метод Java не найден в ColdFusion

Я внедряю GoCardless в свое приложение ColdFusion с помощью их библиотеки Java и столкнулся со следующей ошибкой:

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String([B)Ljava/lang/String;

Как объясняется в документации GoCardless, их библиотека зависит от библиотеки кодеков Apache Commons (среди прочих). Когда я поместил JAR-файл GoCardless в папку с библиотекой ColdFusion, я заметил, что JAR-файл кодека Apache Commons уже присутствует, и поэтому я не уверен, что означает эта ошибка.

Любая помощь приветствуется. Спасибо!


person Michael    schedule 15.07.2013    source источник


Ответы (1)


Предполагая, что вы не вызываете этот метод, он, вероятно, означает именно то, что он говорит. Версия кодека, загружаемая jvm, не содержит метода с такой сигнатурой. Вы можете проверить это, создав экземпляр класса org.apache.commons.codec.binary.Base64 и проверив доступные методы с помощью cfdump. (Это может также быть конфликтом загрузчика классов, но первое более вероятно.)

Что касается причины, когда в пути к классу присутствует несколько версий jar, jvm может выбрать только одну из них. Вероятно, он выбрал более старую версию, поставляемую с ColdFusion, которая может не иметь этого метода. См.: Идентификация из какого jar был загружен класс...

Самый простой способ загрузить более новую версию jar — удалить старый jar в /lib, заменить его более новой версией и перезапустить CF. Имейте в виду, что библиотека также используется самим CF, поэтому вы рискуете что-то сломать, если более новая версия не будет обратно совместима. Другой вариант — использовать динамическую загрузку классов в CF10. . По сути, это копия JavaLoader.cfc Марка Манделя, только что включенная в CF.

person Leigh    schedule 15.07.2013
comment
Я только что cfdumped org.apache.commons.codec.binary.Base64, и метод доступен в классе, загружаемом из /lib - person Michael; 15.07.2013
comment
Подпись совпадает? Потому что в отличие от CF java поддерживает перегруженные методы. Кроме того, вы помещаете их оба в /lib ;-) Так из какого это файла - более старого или более нового? - person Leigh; 15.07.2013
comment
Нет, я никогда не помещал более новую версию в /lib. Единственная версия — та, что поставляется с ColdFusion. Я надеялся, что это будет работать с этой версией. - person Michael; 15.07.2013
comment
О, мой плохой. Возможно, более старая версия не содержит правильной сигнатуры метода, поэтому вам может потребоваться обновление. Я не рядом с CF10, чтобы проверить методы. Можете ли вы обновить свой вопрос снимком экрана cfdump? - person Leigh; 15.07.2013
comment
На самом деле мой плохой! Только что заметил, что он не содержит этого метода, а только одноименного. - person Michael; 15.07.2013
comment
Я попробую динамическую загрузку классов CF10 с новой версией и посмотрю, поможет ли это. Я отчитаюсь. - person Michael; 15.07.2013
comment
Хорошо. Кстати, я не говорил, что замена банки сломает что-то, а только то, что может. Возможно, вы могли бы заменить его, и все было бы хорошо. Вы должны были бы проверить это и посмотреть. - person Leigh; 15.07.2013
comment
Добавил <cfset this.javaSettings = {LoadPaths = ["\gocardless_jars\"], reloadOnChange = true}> в мой файл Application.cfc, и это сделало свою работу. Спасибо! - person Michael; 15.07.2013