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

欢迎!请查阅关于页面以获取更多有关此如何工作的信息。

0
Clojure

更新ASM库(针对CLJ-713)的提交后,Clojure构建通过所有测试,除了reflect.clj中的compare-reflect-and-asm。

这可以部分归因于以下两个表达式的行为差异,这两个表达式是用最新的Clojure和JDK8评估的

`
;; 以下两行曾在2014年1月11日的最新Clojure 1.6.0-master-SNAPSHOT中工作,但使用JDK 8会抛出异常。
;; 如果在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

截至目前,JDK 8和ASM 5都已发布。
我刚刚尝试在JDK 8上用ASM 5编译clojure,全部编译成功。

0

评论者:alexmiller

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

0

评论者:bronsa

我下载了ASM5,将Clojure附带的ASM替换为那个版本,之后将包名改为"clojure.asm"并运行mvn install,所有测试都通过了。

0

评论者:alexmiller

我实际上谈论的是JDK 8的变更——好奇具体发生了什么变化?

0

评论者:alexmiller

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

我们目前没有计划在短时间内用JDK 8构建Clojure,所以我对此不太关心。但似乎嵌入的ASM 4无法读取JDK 8的新类文件。据我所知,这种情况只会发生在AsmReflector中的 clojure.reflect.java,它不是默认的反射器。JavaReflector将正确地反射Java 8类。

ASM 5 出来才几天,就已经有至少一个严重的bug被报道——我想在切换到它之前看到更多使用,所以这可能是Clojure 1.6之后的版本发布的好目标。

0

评论者:alexmiller

修正以暂时禁用失败的测试,直到我们有支持JDK 8的ASM。

0

由:jafingerhut发表的评论

我已经测试了最新的Clojure 1.10.0-RC3代码,使用附件中的patch文件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
by

评论者:alexmiller

不打算为Clojure 1.10做这个,但对于1.11可以评估。

0
by

由:jafingerhut发表的评论

非常理解——这里没有必要急于Clojure 1.10发布。只是过了很长时间,首次浏览未解决缺陷单子列表,看看哪些我能稍微说一些。

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