Я работаю над расширением 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 - это прокси-сервер