2024 Clojure现状调查中分享您的想法!

欢迎!请在关于页面了解更多关于这个功能的信息。

0
Clojure

在将更新后的ASM库提交给CLJ-713之后,Clojure构建通过了所有测试,除了在reflect.clj中比较反射和asm的测试。

这可以缩小到以下两种形式在最新的Clojure和JDK8行为上的差异

`
;;以下两行在最新(2014年1月11日)的Clojure 1.6.0-master-SNAPSHOT中运行正常
;;但如果在JDK 6或JDK 7上运行,则会在JDK 8上抛出异常。

(import '[clojure.asm ClassReader ClassVisitor Type Opcodes])
(def r (ClassReader. "java.lang.Object"))
`

不确定,但通过一些Google搜索,这似乎可能是ASM库版本4的限制 - 当尝试读取由JDK 8生成的类文件时会抛出异常,因为类文件版本号更新了。支持这一结论的链接

http://mail-archive.ow2.org/asm/2013-02/msg00000.html

http://forge.ow2.org/tracker/index.php?func=detail&aid=316375&group_id=23&atid=350023

有几个替代方案

(1) 再次更新ASM,以支持JDK 8类文件

(2) 禁用compare-reflect-and-asm测试。Clojure本身除了解耦测试外,不使用AsmReflector进行任何操作。Java反射器是默认的。

11 条答案

0

评论由:alexmiller

1) 目前还没有发布支持JDK 8的ASM。ASM 5将支持它,但在JDK 8最终发布之前,它将不会是最终的。

2) 可能更可能。

0

评论由:bronsa

到目前为止,JDK8和ASM5都已经发布。
我尝试在JDK8上使用ASM5编译Clojure,并且所有的内容都编译正常。

0

评论由:alexmiller

你是如何运行这个测试的?

0

评论由:bronsa

我下载了ASM5,在更改包名到"clojure.asm"后,将其替换掉Clojure捆绑的ASM,并运行mvn install,所有测试均通过。

0

评论由:alexmiller

我实际上是在谈论JDK 8的更改——我对具体做了哪些更改感兴趣?

0

评论由:alexmiller

特别是,我假设你没有更改build.xml来更改编译时的-source或-target,并且用JAVA_HOME/path设置为JDK 8来运行。

我们没有计划在未来任何时候使用JDK 8来构建Clojure,所以我并不特别关心这一点。但看起来嵌入的ASM 4无法读取来自JDK 8的新类文件。据我所知,这种情况只发生在clojure.reflect.java中的AsmReflector,这不是默认的反射器。JavaReflector将正确反射Java 8的类。

ASM 5只发布了几天,就已经有至少一个严重的错误报告——在我们切换到之前,我想要看到更多的使用,所以也许这是Clojure 1.6之后的发布的好目标。

0

评论由:alexmiller

补丁暂时禁用失败的测试,直到我们有一个支持JDK 8的ASM。

0

评论由:jafingerhut发表的

我已经测试了最新版本的Clojure 1.10.0-RC3代码,使用附件中的补丁clj-1323-experiment-v1.patch重新启用了之前被禁用的测试。

如果没有对文件src/clj/clojure/reflect/java.clj进行更改,在运行OpenJDK 11时会失败,因为未注释的测试在调用{{(type-reflect classname :reflector asm-reflector)}}时抛出异常,调用的是{{java.io.FileInputStream}}类(可能还会调用向量中的其他类)。

按照添加的补丁进行,所有测试在使用以下版本组合时都能通过
+ Mac OS X 10.13.6加上Oracle Java 1.8.0_192
+ Ubuntu 16.04.5加上OpenJDK 11 - 未注释的测试会抛出异常

我并不宣称我知道这个补丁是好的,或者我在文件src/clj/clojure/reflect/java.clj中做的更改的全部影响。我只是想通过代码来做一个实验,看看能否使被注释掉的测试再次通过。像Ghadi Shayban这样的人比我更能评估这种更改的影响。

0

评论由:alexmiller

不打算为Clojure 1.10做这件事,但可以为1.11评估。

0

评论由:jafingerhut发表的

当然明白了 -- 对于Clojure 1.10的发布没有紧急要求。只是最近再次浏览了未关闭的缺陷问题列表,看看有没有一些关于它们我想说点什么的。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1323](https://clojure.atlassian.net/browse/CLJ-1323)(由jafingerhut报告)
...