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

欢迎!有关该如何工作的更多信息,请参阅关于页面

0
Clojure

更新 CLJ-713 的 ASM 库后,Clojure 编译时除了 reflect.clj 中的 compare-reflect-and-asm 测试通过外,所有测试都失败了。

这可以通过在最新的 Clojure 和 JDK8 上评估以下 2 个形式的差异来缩小一些

`
;; 以下两行与最新的 (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 / 路径设置为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

当然明白了 -- 1.10版本发行并不紧急。只是好久没看未解决的缺陷报告单了,看看有没有什么我能提供一些建议的。

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