Estoy trabajando para extender el complemento 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 la función de flujo de registro de ByteArrayOutputStream
in clojure.tools.logging
:
ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn
( https://gist.github.com/a6ae681c37091a3d2379 )
Fui, eliminé clojure.tools.logging
y escribí un proxy reducido de Object
:
(proxy [java.lang.Object] [] (toString [] "proxy's toString"))
y también lanzó ese mismo ClassCastException
mensaje.
Intenté imprimir una macroexpand-1 del proxy y obtuve lo mismo.
Volví a Clojure 1.2.0 y el proxy funcionó bien nuevamente.
Probé 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 llegar a 1.3.0, así que no pasé mucho tiempo con eso.
El seguimiento de la pila apunta a la función 'gen-method definida en una de las formas let de generate-proxy
in core_proxy.clj
.
Agregué un pequeño puñado de println
's por ahí para ver si podía captar lo que estaba sucediendo. Tal vez esta próxima declaración traicione un gran malentendido por parte del lector de mi parte, pero simplemente agregar esos println
s 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, aunque todas las pruebas de Clojure mvn package
continúan pasando.
Por ejemplo, simplemente agregar un println
método único a gen justo antes de que comience a generar bytecode hizo que Clojure arrojara
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 errores, println
pero este es el más frecuente.
Obviamente, algunos aspectos de Grails y Clojure no se combinan correctamente aquí, pero no veo la conexión. Al principio sospeché incompatibilidad con ASM, pero como Clojure tiene su propio espacio de nombres ASM, no veo que ese sea el problema. Pero tal vez me equivoque, he estado mirando clojure.lang.Compiler
, proxy y generate-proxy durante días tratando de que esto funcione y prácticamente dejé de avanzar porque me quedé sin fuerza :(
Pido disculpas por la falta de enlaces. Puede copiar y pegar desde abajo:
Grails Clojure - github.com/grails-plugins/grails-clojure
Registro de herramientas de Clojure - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj línea 133 es el 'proxy
Respuestas:
He encontrado un problema denominado
CLJ-944
en clojure.org . Allí puede encontrar una solución para elClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
problemaEl problema es:
Parche 1 - Parche 0001-Fix-for-CLJ-944.
Parche 2 - Parche 0002-Fix-for-CLJ-944.
Espero que ayude.
fuente