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


103

我正在扩展的Grails的Clojure插件Grails的2.0.0(和2.1.0-SNAPSHOT),我想把它升级到Clojure的1.3.0,并添加clojure.tools.logging

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信息。

我试图打印代理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


4
我做了更多的测试,但我坚信,Grails 2.0中的某些东西破坏了Clojure 1.3所依赖的东西。我测试了我可以在Grails 1.3.7,Groovy 1.8.4(这是Grails 2.0所使用的)和Groovy 1.8.5(最新的)中可以想到的最简单的代码示例,并且所有这些都可以使用。
约翰·考特兰

3
这可能是ClassLoader问题吗?
杰里米(Jeremy)

Answers:


4

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

问题是:

编译器将不正确的类型转换注入clojure.lang.PersistentHashMap。在这种情况下,应将其强制转换为clojure.lang.Associative,这是具有.containsKey方法的最高公共接口。

补丁1-0001-CLJ-944修复。补丁

补丁2-0002-CLJ-944修复。补丁

希望对您有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.