我正在扩展的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