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

欢迎!有关如何使用本网站的信息,请参阅 关于 页面。

+3

当在 JDK 11 上运行 Clojure 时,clojure.java.javadoc/javadoc 函数无法打开到 java.base 模块外的 JDK 类的正确 URL。

例如


正确的 URL 应该是 https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/Connection.html

这是由 clojure.java.javadoc 命名空间中的 *core-java-api* 定义引起的。

我想知道是否有更好的方法可以泛型处理所有标准的 JDK 类,而不仅仅是那些在 java.base 模块中的。

请注意,初始时此问题已在 Emacs Cider 项目中提出:https://github.com/clojure-emacs/cider/issues/2687

已关闭,并附带备注:发布

3 答案

0
 
最佳答案

此修复已在1.10.2-alpha3版本中发布。

+1

对于类klass,您可以使用Clojure中的Java互操作来通过getModule方法确定它所在的模块,方法如下:https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#getModule--

然后,对生成的模块执行getNamehttps://docs.oracle.com/javase/9/docs/api/java/lang/Module.html#getName--

例如:

user=> (.getName (.getModule java.sql.Connection))
"java.sql"

看起来这类URL是从JDK 11开始的,而不是模块引入时的JDK 9,所以不应该在JDK 11之前的版本上使用。

是的,我也发现了。
然而,这并没有改变这样一个事实:`clojure.java.javadoc/javadoc`在JDK 11上基本上对于java.base模块外的类是损坏的。
也许它最初就不是为了让它们工作的?
当然,clojure.java.javadoc/javadoc的内置行为在JDK 11(也许还包括JDK 12,尽管我还没尝试)使用时肯定不会访问正确的URL。希望Clojure的后续版本能在这方面有所改进。

我可能会找一些时间来为Clojure创建一个补丁,但在此期间,我想分享我所学到的知识,以防你想尝试这样做。如果你感兴趣,我很乐意向你介绍创建和测试补丁的步骤。
0

Juraj,我正在研究为 Clojure 的 javadoc 创建一个建议的补丁来改善这种情况,并意识到 Clojure 的 javadoc 也试图计算包含在 Java 内部库之外的其他库的正确 URL。

您(或正在阅读此内容的任何人)是否知道这个想法(在 URL 中包含模块名称)是否被除了核心 Java 库之外的其他项目采纳?

对于 Java 本身,包含 Java 模块名称的决定因素似乎为“JDK 11或更高版本”。我已经确认 JDK 12 文档遵循这一规则。JDK 13 文档在 Oracle 的网站上尚未提供 URL,因此尚不清楚其计划。

我对此思考了一下,提出了一个可能的关于 Clojure 的变更建议,可能被接受,但还没有经过任何审查,所以我无法确定 Clojure 核心团队是否有兴趣在 javadoc 中改变行为,更不用说按照补丁中建议的特定方式了。

https://clojure.atlassian.net/browse/CLJ-2534
有趣的解决方案,使用`JAVA_MODULE_NAME`占位符,感谢提交的 Jira 请求单。
我在那里添加了有关可能的 NPE 的注释。
...