在Grails 2.0.0运行时生成的Clojure 1.2.1 / 1.3 / 1.4'代理失败。 1.2.0很好

时间:2012-02-01 19:29:49

标签: grails groovy clojure proxy

我正在努力扩展Grails Clojure plugin中的Grails 2.0.0(以及2.1.0-SNAPSHOT),我想将其更新为Clojure 1.3.0并添加clojure.tools.logging

Clojure在编译期间抛出异常 ByteArrayOutputStream的{​​{1}}日志流功能的代理

clojure.tools.logging

https://gist.github.com/a6ae681c37091a3d2379

我去了ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn并写了clojure.tools.logging代理

Object

并且它也抛出相同的(proxy [java.lang.Object] [] (toString [] "proxy's toString"))和消息。

我尝试打印代理 macroexpand-1 并得到了相同的东西。

我恢复了Clojure 1.2.0并且 proxy 再次正常工作。

我尝试了1.4.0的许多版本,它们表现出与1.3.0相同的行为。 1.2.1也引发了某种异常,但我试图达到1.3.0,所以我没有花太多时间。

堆栈跟踪指向'ClassCastExceptiongenerate-proxy的一个 let 形式中定义的'gen-method函数。

我在那里添加了一小部分core_proxy.clj,看看我能不能发现正在发生的事情。也许下一个陈述将背叛读者对我的巨大误解,但只是添加println以一种我完全没想到的方式改变了编译时行为。即使println中的所有Clojure测试都继续通过,异常位置和异常类型也完全改变了。

例如,在开始生成字节码之前,只在生成方法中添加一个mvn package会导致Clojure抛出

println

https://gist.github.com/5a7a40929a6c4a104bd5

我已经看到了其他各种错误,具体取决于我放置ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class(s)的位置,但这是最普遍的。

显然,Grails和Clojure的某些方面在这里没有正确啮合,但我没有看到连接。起初我怀疑ASM不兼容,但由于Clojure有自己的ASM命名空间,我不明白这是问题所在。但也许我错了,我一直在盯着println代理生成代理几天来试图让它发挥作用我就是我几乎停止了前进的进展,因为我已经筋疲力尽了:(

我为缺乏链接而道歉。您可以从下面复制和粘贴:

Grails Clojure - github.com/grails-plugins/grails-clojure

Clojure工具记录 - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj第133行是'代理

1 个答案:

答案 0 :(得分: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

我希望它有所帮助。