instalar - Proxy Clojure 1.2.1/1.3/1.4 ''generado en el tiempo de ejecución de Grails 2.0.0 falla. 1.2.0 está bien
sdkman java list (1)
Estoy trabajando para extender el plugin Grails Clojure en Grails 2.0.0 (y 2.1.0-SNAPSHOT) y quería actualizarlo a Clojure 1.3.0 y agregar clojure.tools.logging .
Clojure lanza una excepción durante la compilación de un proxy de ByteArrayOutputStream
en la función de secuencia de registro de clojure.tools.logging
:
ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn
( https://gist.github.com/a6ae681c37091a3d2379 )
Fui y clojure.tools.logging
y escribí un proxy desglosado de Object
:
(proxy [java.lang.Object] [] (toString [] "proxy''s toString"))
y también arrojó esa misma ClassCastException
y mensaje.
Intenté imprimir un macroexpand-1 del proxy y obtuve lo mismo.
Volví a Clojure 1.2.0 y el proxy funcionaba bien de nuevo.
Intenté varias encarnaciones de 1.4.0 y exhiben el mismo comportamiento que 1.3.0. 1.2.1 también arroja algún tipo de excepción, pero estoy tratando de golpear 1.3.0 así que no pasé mucho tiempo con eso.
El rastreo de la pila apunta a la función gen-method definida en una de las formas let de generate-proxy
en core_proxy.clj
.
println
un pequeño puñado de println
por allí para ver si podía captar lo que estaba sucediendo. Tal vez esta próxima declaración revele una gran incomprensión del lector de mi parte, pero el simple hecho de agregar esas println
cambió el comportamiento del tiempo de compilación de una manera que no esperaba. La ubicación de la excepción y el tipo de excepción cambiaron por completo, a pesar de que todas las pruebas Clojure en el mvn package
continúan pasando.
Por ejemplo, simplemente al agregar una única println
al gen-método justo antes de que comience a generar el bytecode, Clojure lo lanzó
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
( https://gist.github.com/5a7a40929a6c4a104bd5 )
He visto varios otros errores dependiendo de dónde coloque los println
(s), pero este es el más frecuente.
Obviamente, algunos aspectos de Grails y Clojure no encajan correctamente aquí, pero no veo la conexión. Al principio, sospeché la incompatibilidad ASM, pero dado que Clojure tiene su propio espacio de nombre ASM, no veo que ese sea el problema. Pero tal vez estoy equivocado, he estado mirando clojure.lang.Compiler
, proxy y generate-proxy durante días tratando de hacer que esto funcione y he dejado de avanzar porque me he quedado sin vapor :(
Me disculpo por la falta de enlaces. Puede copiar y pegar desde abajo:
Grails Clojure - github.com/grails-plugins/grails-clojure
Clojure Tools Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj línea 133 es el ''proxy
Encontré un problema llamado CLJ-944
en clojure.org . Allí puede encontrar una solución para ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
problema ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
El problema es:
que el compilador inyecta un lanzamiento incorrecto a clojure.lang.PersistentHashMap. En este caso, probablemente debería ser lanzado a clojure.lang.Associative, la interfaz común más alta que tiene el método .containsKey.
Parche 1 - 0001-Fix-for-CLJ-944.patch
Parche 2 - 0002-Fix-for-CLJ-944.patch
Espero que ayude.