Clojure 2024调查问卷中分享您的想法!

欢迎!请访问关于页面了解更多关于该功能的信息。

0
Clojure

在将更新后的ASM库提交到CLJ-713之后,Clojure构建通过了所有测试,除了reflect.clj中的compare-reflect-and-asm测试。

我们可以将问题缩小到以下两个形式在使用最新的Clojure和Java 8时的行为差异

`
;; 以下两行与2014年1月11日的Clojure 1.6.0-master-SNAPSHOT版本一起运行时有效
;; 如果在JDK 6或JDK 7上运行,但在Java 8上会抛出异常。

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

我不太确定,但通过一些Google搜索,这似乎可能是ASM库版本4的限制 - 当尝试读取由Java 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以支持Java 8类文件

(2) 禁用compare-reflect-and-asm测试。Clojure本身并不使用AsmReflector来做任何事情,除了这个单元测试。Java反射器是默认的。

11 答案

0

评论人:alexmiller

1) 尚未发布支持Java 8的ASM。ASM 5将支持但不会在Java 8最终发布之前完成。

2) 可能更可能。

0

评论人:bronsa

现在,JDK 8和ASM 5都已发布。
我刚刚尝试使用ASM 5在Java 8上编译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 中更新的类文件。据我所知,这种情况只发生在 AsmReflector 的 clojure.reflect.java 中,这并不是默认的反射器。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报告)
...