Прокси-сервер Clojure 1.2.1/1.3/1.4 ', сгенерированный во время выполнения Grails 2.0.0. 1.2.0 отлично

Я работаю над расширением Grails Clojure плагин в Grails 2.0.0 (и 2.1.0-SNAPSHOT), и я хотел обновить его до Clojure 1.3.0 и добавьте clojure.tools.logging.

Clojure выдает исключение во время компиляции прокси-сервера ByteArrayOutputStream в clojure.tools.logging функции журнала потока:

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 toString"))

и он также добавил то же самое ClassCastException и сообщение.

Я попытался напечатать макроэкземпляр-1 прокси-сервера и получил то же самое.

Я вернулся к Clojure 1.2.0, а прокси снова работал отлично.

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

Трассировка стека указывает на функцию gen-метода, определенную в одной из форм let 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 (s), но это наиболее распространенный.

Очевидно, что некоторые аспекты Grails и Clojure здесь неправильно связаны, но я не вижу связи. Сначала я подозревал несовместимость ASM, но поскольку Clojure имеет собственное пространство имен ASM, я не вижу, что это проблема. Но, возможно, я ошибаюсь, я смотрел на clojure.lang.Compiler, proxy и generate-proxy в течение нескольких дней, пытаясь заставить это работать, и я в значительной степени прекратил продвигаться вперед, потому что у меня закончилось пар: (

Извиняюсь за отсутствие ссылок. Вы можете копировать и вставлять снизу:

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

Clojure Ведение журнала инструментов - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj строка 133 - это прокси-сервер

Ответ 1

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

Проблема заключается в следующем:

что компилятор вводит неверный перевод в clojure.lang.PersistentHashMap. В этом случае, вероятно, это должно быть отбрасывается на clojure.lang.Associative, самый высокий общий интерфейс с использованием метода .containsKey.

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

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

Надеюсь, это поможет.