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

欢迎!请查看 关于 页面以了解更多关于这个站点的工作信息。

0
Clojure

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

Clojure 中有一些对生存于 java.base 模块(或 bcp)之外类别的引用(在 Clojure 1.9 及以后版本中,核心空间的加载变为条件性的,依赖于 java.sql.Timestamp 类的可用性)。这是为了使 lein 上的 Clojure 能够在 Java 8 bootclasspath 上运行所做的一种权宜之计。lei 使用 bootclasspath 作为一种规避字节码验证的技巧,从而加快加载速度(在 bcp 上禁止对 java.sql.Timestamp 的引用。)这也导致了未加载 java.util.Date 的 read/print 处理器,而这些处理器存在于 bcp 或 java.base 模块中。

当前状况
自 JDK9 以来,bootclasspath 的观念已不存在


jlinking JVMs 是一种常见的有效容器部署策略

Clojure 已经在 bootclasspath 或仅包含 #{java.base} 的 JVM 上运行得很好,但默认的数据读取器 & clojure.instant 没有被加载,因此没有安装 inst/j.u.Date 的 read/print 处理器。条件加载是关于 java.sql.Timestamp 的,但它只在本质上没有被默认使用(除了打印处理器以外),但它影响了在减少环境中的工作(java.sql.Timestamp 在 java.sql 模块中,为 jlinked jvm 增加了额外的 12MB)

优秀的日期标签值处理使 Clojure 的 REPL 与其他动态语言区分开来。很希望这些便利性能在所有模块化 JDK 上一致可用。

考虑事项
减少条件加载的范围以避免影响日期读取/打印处理器?
将读取处理器的安装移动到 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

评论者:gshayban

补丁中的方法

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