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

欢迎!请查阅关于页面,了解更多关于这样工作的信息。

0 投票
Clojure

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

我不是很确定,但通过一点 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仅发布了几天就已经报告了一个严重的 bug - 我希望在切换到它之前看到更多的使用,所以这可能是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 投票
by

评论者:alexmiller

目前不准备为Clojure 1.10做这项工作,但可以去评估1.11版本。

0 投票
by

评论者:jafingerhut

当然明白——Clojure 1.10的发布并不急迫。只是偶尔查看一下开放缺陷票单,看看哪些是我可以稍微发表一些看法的。

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