首页 文章

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

提问于
浏览
102

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

clojure.tools.logging 的日志流函数中编译 ByteArrayOutputStream 的代理期间,Clojure会抛出异常:

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,所以我没有花太多时间 .

堆栈跟踪指向' core_proxy.cljgenerate-proxy 的let形式中定义的'gen-method函数 .

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

例如,在开始生成字节码之前,只需将一个 println 添加到gen-method就会导致Clojure抛出

ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

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

我已经看到了各种其他错误,这取决于我放置 println (s)的位置,但这是最普遍的 .

显然,Grails和Clojure的某些方面在这里没有正确啮合,但我没有看到连接 . 起初我怀疑ASM不兼容,但由于Clojure有自己的ASM名称空间,我可以't see that being the issue. But maybe I'错了,我一直盯着 clojure.lang.Compiler ,代理和生成代理几天,现在试图让这个工作,我_747913已经用完了蒸汽 :(

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

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 回答

  • 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

    我希望它有所帮助 .

相关问题