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

欢迎!请参见关于页面了解有关此功能的更多信息。

0
Clojure

在提交CLJ-713更新的ASM库之后,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

目前,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 类文件。据我所知,这种情况只发生在 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}}(以及可能在向量中的其他类)进行操作时抛出了异常。

按照补丁编写的方式,以下版本的组合都可以通过所有测试
+ macOS 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)
...