加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Grails 2.0.0运行时生成的Clojure 1.2.1/1.3/1.4’代理失败 1.

发布时间:2020-12-14 16:41:04 所属栏目:大数据 来源:网络整理
导读:所以我有一个奇怪的情况。 我正在扩展Grails Clojure plugin在Grails 2.0.0(和2.1.0-SNAPSHOT),我想更新到Clojure 1.3.0和添加clojure.tools.logging。 Clojure在编译期间抛出异常 代理一个ByteArrayOutputStream在clojure.tools.logging的日志流函数: Cla
所以我有一个奇怪的情况。

我正在扩展Grails Clojure plugin在Grails 2.0.0(和2.1.0-SNAPSHOT),我想更新到Clojure 1.3.0和添加clojure.tools.logging。

Clojure在编译期间抛出异常
代理一个ByteArrayOutputStream在clojure.tools.logging的日志流函数:

ClassCastException:clojure.asm.Type不能转换为clojure.lang.IFn

(https://gist.github.com/a6ae681c37091a3d2379)

我去了并删除clojure.tools.logging并写了一个剥离的代理对象:

(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.clj中的generate-proxy的let形式之一中定义的“gen-method”函数。

我在那里添加了一些小的println,看看我是否能捕捉到发生了什么。也许这下一个语句将背叛读者对我的一个巨大的误解,但只是添加那些printlns改变了编译时的行为,在一个我完全没有想到的方式。异常位置和异常类型完全改变,即使所有在mvn包中的Clojure测试继续通过。

例如,只是在gen-method开始生成字节码之前添加一个println引起Clojure抛出

ClassCastException:clojure.lang.PersistentArrayMap不能转换为java.lang.Class

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

我看到各种其他错误,取决于我放在println(s),但这是最普遍的。

显然Grails和Clojure的一些方面在这里没有正确网格,但我没有看到连接。起初我怀疑ASM不兼容,但是因为Clojure有自己的ASM命名空间,我不能看到这是问题。但也许我错了,我一直盯着clojure.lang.Compiler,代理和生成代理的天,现在试图让这个工作,我几乎停止向前进步,因为我用完了蒸汽 :(

感谢您提供任何帮助。我会提供任何我可以,我真的很想得到
这个工作。

我为缺乏链接道歉,显然是不会让我发布超过2,因为我是新的。您可以从下面复制和粘贴:

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

Clojure工具日志 – github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj行133是’代理

解决方法

我在 clojure.org上发现了一个名为CLJ-944的问题。您可以找到ClassCastException的修复:clojure.lang.PersistentArrayMap不能转换为java.lang.Class问题

问题是:

that the compiler injects an incorrect cast to
clojure.lang.PersistentHashMap. In this case it should probably be
cast to a clojure.lang.Associative,the highest common interface
having the .containsKey method.

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

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

我希望它有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读