1
在Grails 2.0.0运行时生成的Clojure 1.2.1 / 1.3 / 1.4'代理失败。1.2.0很好
我正在扩展的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's toString")) 它也引发了同样的ClassCastException信息。 我试图打印代理的macroexpand-1,并得到了同样的东西。 我恢复为Clojure 1.2.0,代理再次正常工作。 我尝试了多个1.4.0的版本,它们表现出与1.3.0相同的行为。1.2.1也引发了一些异常,但是我试图达到1.3.0,所以我并没有花太多时间。 堆栈跟踪指向in的let形式之一generate-proxy中定义的'gen-method函数core_proxy.clj。 我在附近添加了一个小的符号,println以查看是否可以捕获正在发生的情况。也许下一条语句会背叛我,这对读者是一个巨大的误解,但只是添加这些内容println,就以我完全没想到的方式改变了编译时的行为。即使所有Clojure测试mvn package继续通过,异常位置和异常类型也已完全更改。 例如,println在开始生成字节码之前仅在gen-method中添加一个会导致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,代理和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行是'proxy