mac instalar grails groovy clojure proxy

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.