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 6或JDK 7上运行,但在JDK 8上抛出异常。

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

我不确定,但从一些谷歌搜索来看,这似乎是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
by

评论由:alexmiller

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

0
by

评论由:bronsa

我下载了ASM5,将clojure捆绑的ASM替换为那一个,在将包名改为"clojure.asm"后将编译结果运行mvn install,所有测试都通过了。

0
by

评论由:alexmiller

我实际上在谈论关于JDK 8的变更 - 我很好奇具体发生了什么变化?

0
by

评论由:alexmiller

具体来说,我假设你没有修改构建.xml以更改编译的源和目标,以及用JAVA_HOME/path设置为JDK 8来运行。

我们现在没有计划在近期用JDK 8构建Clojure,所以我对此不太担心。但它似乎说明内嵌的ASM 4不能读取JDK 8的新类文件。据我所知,这种情况只发生在AsmReflector的clojure.reflect.java中,这不是默认的反射器。JavaReflector能正确地反射Java 8类。

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

0
by

评论由:alexmiller

补丁:在找到能支持JDK 8的ASM之前,暂时禁用失败的测试。

0
by

评论者: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

当然理解——这里没有1.10发布的需求。我只是过一段时间才再次浏览未解决的缺陷话票列表,看看哪些我有话要说。

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