2012-02-01 37 views
103

我正致力于将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的一个 代理一个ByteArrayOutputStreamclojure.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-proxycore_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是“代理

+4

我已经做了一些更多的测试,我完全相信这是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

+3

这可能是一个ClassLoader问题? – Jeremy 2012-03-31 03:43:59

回答

4

我在clojure.org上发现了一个叫CLJ-944的问题。在那里,你可以找到一个解决的ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class问题

的问题是:

编译器注入了不正确的投地 clojure.lang.PersistentHashMap。在这种情况下,它应该可以转换为clojure.lang.Associative,最高通用接口 具有.containsKey方法。

补丁1 - 0001-Fix-for-CLJ-944.patch

补丁2 - 0002-Fix-for-CLJ-944.patch

我希望它能帮助。

相关问题