问题
关于日期的默认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