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

欢迎!请查看关于页面,了解更多关于如何使用本网站的信息。

0
Clojure

问题
关于日期的默认REPL打印和读取在最小运行时环境(如仅包含java.base模块的JVM或已弃用的JDK8 bootclasspath/bcp)与完整JVM之间不一致。

Clojure中有几个对生活在java.base模块(或bcp)之外的类(例如,{{bean}}被用户首次调用时)的引用。在这些所有地方,引用类在Clojure的初始化期间不会自动加载。(它们按需加载,例如)在Clojure 1.9中,core.instant命名空间加载变得有条件,取决于java.sql.Timestamp类的可用性。这是为了使lein能够Clojure运行在Java 8 bootclasspath上的一种折衷办法,lein将其用作绕过字节码验证并因此更快加载的解决问题。(在bcp上关于java.sql.Timestamp的引用是不允许的。)这同时也导致没有加载read/print处理器java.util.Date,这些处理器在bcp或java.base模块上确实存在。

当前状况
lein已经停止(错误地)使用bootclasspath(而是显式跳过字节码验证)
从JDK9开始,bootclasspath的概念不再存在。
现在有一个底部模块,其中包含一组明确的类,包括java.util.Date和java.time.Instant
使用jlinking JVM是常见的有效容器部署策略。

Clojure已经在bootclasspath或仅包含#java.base的JVM上运行得很好,但由于默认的数据读取器& clojure.instant没有加载,所以不会安装read/print处理器inst/j.u.Date。有条件的加载是关于java.sql.Timestamp,但总的来说它不会影响在简化环境中工作得很好。java.sql.Timestamp位于java.sql模块中,这会使jlinked jvm增加12MB左右的额外空间。

卓越的日期标签价值处理使Clojure的REPL与其他动态语言区分开来。能够在所有模块化JDK上一致地提供这些便利将会很棒。

考虑事项
缩小有条件加载的范围以避免影响日期的read/print处理器?
将读取处理器的安装移入clojure.instant,并无条件加载它?(从未有关于处理器安装的承诺)
java.time.Instant也在bootclasspath或java.base模块中。

信息性
以下列出了java.base模块之外的类引用列表,不包括core.clj中的java.sql.Timestamp检查。

clojure.core$bean -> java.beans.BeanInfo java.desktop clojure.core$bean$fn__6987$fn__6988 -> java.beans.PropertyDescriptor java.desktop clojure.core$resultset_seq -> java.sql.ResultSet java.sql clojure.inspector$inspect -> java.awt.BorderLayout java.desktop clojure.inspector$inspect_table -> java.awt.Component java.desktop clojure.inspector$inspect_tree -> java.awt.Component java.desktop clojure.instant$construct_timestamp -> java.sql.Timestamp java.sql clojure.instant$print_timestamp -> java.sql.Timestamp java.sql clojure.java.browse_ui$open_url_in_swing -> java.awt.Component java.desktop clojure.lang.XMLHandler -> org.xml.sax.Attributes java.xml clojure.repl$set_break_handler_BANG_ -> sun.misc.Signal JDK内部API(jdk.unsupported) clojure.repl$set_break_handler_BANG_ -> sun.misc.SignalHandler JDK内部API(jdk.unsupported) clojure.repl.proxy$java.lang.Object$SignalHandler$d8c00ec7 -> sun.misc.Signal JDK内部API(jdk.unsupported) clojure.repl.proxy$java.lang.Object$SignalHandler$d8c00ec7 -> sun.misc.SignalHandler JDK内部API(jdk.unsupported) clojure.xml$startparse_sax -> javax.xml.parsers.SAXParserFactory java.xml clojure.xml$fn__8900 -> org.xml.sax.ContentHandler java.xml

2 个答案

0
by

评论由:gshayban 发表

补丁中的方法

  • 无条件加载 clojure.instant 以及 #inst 读取器
  • 仅使用条件加载包裹 sql.Timestamp 打印方法扩展
  • 删除 when-class(现在已弃用,因为它无法用于包裹 defmethods,因为 java.sql.Timestamp 类常量需要延迟加载)
0
by
参考: https://clojure.atlassian.net/browse/CLJ-2380(由gshayban报告)
...