Я работаю над расширением плагина Grails Clojure в Grails 2.0.0 (и 2.1.0-SNAPSHOT), и я хотел обновить его до Clojure 1.3.0 и добавить clojure.tools.logging .
Clojure выдает исключение во время компиляции
прокси функции потока журнала в ByteArrayOutputStream
in 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's toString"))
и он тоже закинул то же ClassCastException
и сообщение.
Я попытался напечатать MACROEXPAND-1 из прокси и получил то же самое.
Я вернулся к Clojure 1.2.0, и прокси снова работал нормально.
Я пробовал несколько версий 1.4.0, и они показывают то же поведение, что и 1.3.0. 1.2.1 также выдает какое-то исключение, но я пытаюсь достичь 1.3.0, поэтому я не тратил на это много времени.
Трассировка стека указывает на функцию 'gen-method, определенную в одной из форм let файла generate-proxy
in 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
(и), но это самая распространенная.
Очевидно, что некоторые аспекты Grails и Clojure здесь некорректно связаны, но я не вижу связи. Сначала я подозревал несовместимость ASM, но, поскольку Clojure имеет собственное пространство имен ASM, я не вижу в этом проблемы. Но , может быть , я не прав, я смотрел на clojure.lang.Compiler
, прокси - сервер и сгенерировать прокси в течение нескольких дней теперь пытается получить эту работу , и я в значительной степени перестал делать вперед прогресс , потому что я выдыхаться :(
Прошу прощения за отсутствие ссылок. Вы можете скопировать и вставить снизу:
Grails Clojure - github.com/grails-plugins/grails-clojure
Ведение журнала инструментов Clojure - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj строка 133 - это прокси
Ответы:
Я обнаружил проблему
CLJ-944
на clojure.org . Там вы можете найти решениеClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
проблемыПроблема в:
Патч 1 - 0001-Fix-for-CLJ-944.patch
Патч 2 - 0002-Fix-for-CLJ-944.patch
Я надеюсь, что это помогает.
источник