我正致力于将Grails Clojure plugin扩展为Grails 2.0.0(和2.1.0-SNAPSHOT),我想将其更新为Clojure 1.3.0并添加clojure.tools.logging。在Grails 2.0.0运行时生成的Clojure 1.2.1/1.3/1.4代理失败。 1.2.0很好
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
和消息。
我试图打印一个宏观展望-1代理并得到了同样的东西。
我恢复到Clojure 1.2.0和代理再次正常工作。
我尝试了一些1.4.0的化身,它们表现出与1.3.0相同的行为。 1.2.1也会抛出一些异常,但我试图达到1.3.0,所以我没有花太多时间。
堆栈跟踪指向其中一个generate-proxy
core_proxy.clj
之一中定义的“gen-method”函数。
我在那里添加了一小块println
的东西,看看我能否抓住发生的事情。也许这个下一个陈述将会泄露读者对我的巨大误解,但是简单地加入那些println
就改变了我完全没有想到的编译时行为。即使所有Clojure测试mvn package
继续通过,异常位置和异常类型也完全更改。
举例来说,只是增加一个println
到GEN-方法正确才开始生成字节码造成的Clojure扔
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
(https://gist.github.com/5a7a40929a6c4a104bd5)
我见过各种不同其他错误在哪里我把println
(s),但这是最流行的。
显然Grails和Clojure的某些方面在这里没有正确啮合,但我没有看到连接。起初我怀疑ASM不兼容,但由于Clojure有自己的ASM命名空间,所以我看不出这是问题所在。但也许我错了,我一直盯着clojure.lang.Compiler
,代理和生成代理几天,现在试图让这个工作,我几乎停止前进的进展,因为我已经用完了蒸汽:(
我的不足链接道歉,您可以复制并粘贴从下面:
的Grails的Clojure - github.com/grails-plugins/grails-clojure
Clojure的工具记录 - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj行133是“代理
我已经做了一些更多的测试,我完全相信这是Grails 2.0中的一些东西,它破坏了Clojure 1.3依赖的某些东西。我测试了我可以在Grails 1.3.7,Groovy 1.8.4(Grails 2.0使用的是什么)和Groovy 1.8.5(最新)以及所有这些工作的最简单的代码示例。 – 2012-02-07 14:50:08
这可能是一个ClassLoader问题? – Jeremy 2012-03-31 03:43:59