Проксі-сервер Clojure 1.2.1 / 1.3 / 1.4 ', згенерований у Grails 2.0.0, виконує збій. 1.2.0 - це добре


103

Я працюю над розширенням плагіна Grails Clojure у Grails 2.0.0 (та 2.1.0-SNAPSHOT), і хотів оновити його до Clojure 1.3.0 та додати Clojure.tools.logging .

Clojure кидає виняток при компіляції проксі з ByteArrayOutputStreamв clojure.tools.loggingфункції входу потоку «S:

ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn

( https://gist.github.com/a6ae681c37091a3d2379 )

Я пішов і зняв clojure.tools.loggingі написав усічену проксі з Object:

(proxy [java.lang.Object] [] (toString [] "proxy's toString"))

і він також кинув те саме ClassCastExceptionі повідомлення.

Я спробував надрукувати MACROEXPAND-1 з проксі і отримав те ж саме.

Я повернувся до Clojure 1.2.0 і проксі знову працював нормально.

Я спробував кілька втілень 1.4.0, і вони проявляють таку ж поведінку, що і 1.3.0. 1.2.1 також викидає якийсь виняток, але я намагаюся вдарити 1.3.0, тому я не витрачав багато часу на це.

Трасування стека вказує на функцію 'gen-method, визначену в одній із пускових форм generate-proxyв core_proxy.clj.

Я додав невеличкого парфування printlnтам, щоб побачити, чи зможу я зрозуміти, що відбувається. Можливо, наступне твердження зрадить величезне непорозуміння читача з мого боку, але просто додавання цих printlnзмін змінило поведінку часу компіляції таким чином, який я повністю не очікував. Місце виключення та тип винятку повністю змінилися, навіть незважаючи на те, що всі тести Clojure mvn packageпродовжують проходити.

Наприклад, саме додавання одиниці printlnдо методу gen безпосередньо перед початком генерації байт-коду викликало перекидання Clojure

ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

( https://gist.github.com/5a7a40929a6c4a104bd5 )

Я бачив різні інші помилки залежно від того, куди я поставив println( -ла ), але це є найбільш поширеним.

Очевидно, що деякі аспекти Грааля і Клуджура тут неправильно пов'язані, але я не бачу зв'язку. Спочатку я підозрював несумісність ASM, але оскільки у Clojure є власний простір імен ASM, я не можу побачити, що це проблема. Але , може бути , я помиляюся, я дивився на clojure.lang.Compiler, проксі і згенерувати проксі в протягом декількох днів тепер намагається отримати цю роботу , і я в значній мірі перестав робити вперед прогрес , тому що я видихатися :(

Прошу вибачення за відсутність посилань. Ви можете скопіювати та вставити знизу:

Grails Clojure - github.com/grails-plugins/grails-clojure

Clojure Інструменти Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj лінія 133 є «проксі


4
Я зробив ще кілька тестувань, і я все, але впевнений, що це щось в Grails 2.0, що загрожує тим, на що покладається Clojure 1.3. Я протестував найпростіший зразок коду, який я можу уявити в Grails 1.3.7, Groovy 1.8.4 (для чого використовується Grails 2.0) і Groovy 1.8.5 (останній), і всі вони працюють.
Джон Кортленд

3
Чи може це бути проблемою ClassLoader?
Джеремі

Відповіді:


4

CLJ-944На сайті clojure.org я знайшов випуск . Там ви можете знайти виправлення ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Classпроблеми

Проблема полягає в наступному:

що компілятор вводить неправильний формат в clojure.lang.PersistentHashMap. У цьому випадку він, ймовірно, повинен бути переданий на clojure.lang.Associative, найвищий загальний інтерфейс, що має метод .containsKey.

Патч 1 - 0001-Fix-for-CLJ-944.patch

Патч 2 - 0002-Fix-for-CLJ-944.patch

Я сподіваюся, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.