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

欢迎!请参阅关于页面获取更多关于这个站点的信息。

0
Clojure

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

Clojure中有几个对java.base模块(或bcp)之外的类的引用。在这些所有位置,引用类在Clojure的初始化期间不会自动加载。(它们在需要时加载,例如当用户第一次调用{{bean}}时)。Clojure 1.9中core.instant命名空间加载变得有条件,取决于java.sql.Timestamp类是否存在。这是对lein Clojure在Java 8 bootclasspath上运行的一种妥协,lein使用了一种技巧来避免字节码验证并因此提高加载速度。(在bcp上禁止引用java.sql.Timestamp)这也带来了副作用,即没有对java.util.Date的read/print处理程序进行加载,这些处理程序在bcp或java.base模块中是存在的。

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

Clojure已经在bootclasspath或仅包含#{java.base}的JVM上运行良好,但由于默认的数据读取器和clojure.instant没有加载,因此没有安装inst/j.u.Date的read/print处理程序。有关java.sql.Timestamp的有条件加载会影响在简化环境中运行良好的事物。(java.sql.Timestamp在java.sql模块中,这会将额外的12MB添加到jlinked JVM中)

日期的出色标签处理使Clojure的REPL与其他动态语言区别开来。在这些模块化的JDK上保持这些便利性的可用性将非常令人满意。

考虑事项
减少有条件加载的范围以避免影响日期的read/print处理程序?
将read处理程序的安装移动到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的print-method扩展
  • 移除when-class(不再使用,因为对于包装defmethods,需要延迟java.sql.Timestamp类的常量)
0
明确了 by
参考:[链接到CLJ-2380](https://clojure.atlassian.net/browse/CLJ-2380) (由gshayban报告)
...