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"))
`

我不确定,但是从一点 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仅发布了几天,就已经报告了一个严重的错误——在我们切换到它之前,我想看到更多使用,所以这可能是在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

完全理解 -- 对于1.10版本没有紧迫的任务。只是在最近一段时间首次浏览开放缺陷票据列表,看看哪些票据我可能可以稍微谈谈。

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