Прокси-сервер 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 выдает исключение во время компиляции прокси функции потока журнала в ByteArrayOutputStreamin 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-proxyin 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 - это прокси

Джон Кортленд
источник
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

Я надеюсь, что это помогает.

Sentencio
источник