请分享您的想法,参与2024 Clojure 状态调查!

欢迎!请查看关于页面以获取更多关于这个工作方式的信息。

+3
贡献库
关闭

当在 JDK 11 上运行 Clojure 时,clojure.java.javadoc/javadoc 函数无法打开 JDK 类(不在 java.base 模块之外)的适当 URL。

例如
- (javadoc java.lang.String) 打开 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html
- (javadoc java.sql.Connection) 打开 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/sql/Connection.html 这是错误的,因为模块名称应该是 java.sql,而不是 java.base
正确的 URL 应该是 https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/Connection.html

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

我想知道是否有更好的方法来通用地处理所有标准 JDK 类,不仅仅是那些在 java.base 模块中的类。

请注意,最初这个问题是在 Emacs Cider 项目中提出的:https://github.com/clojure-emacs/cider/issues/2687

已关闭并备注: 已发布

3答案

0
by
 
最佳答案

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

+1
by

对于一个类 klass,您可以运用Clojure的Java互操作功能,通过使用getModule方法(https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#getModule--)来找出它所在模块的名称。

然后对返回的模块执行getName方法:https://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之前的版本中使用。

by
是的,我发现是这样的。
然而,这并不能改变这样一个事实:对于java.base模块外部的类,clojure.java.javadoc/javadoc在JDK 11上的执行基本是失败的。
也许它从一开始就不应该在那些类上工作?
by
当然,使用JDK 11(以及可能还有JDK 12,尽管我没有尝试)时,clojure.java.javadoc/javadoc的内置行为确实不能将正确的URL传入。如果Clojure的后期版本能对此进行改进将是非常好的。

我可能会找到一些时间来为 Clojure 编写一个补丁,但在那之前,我想分享一下我所学的知识,以防你想尝试这样做。如果你有兴趣,我很乐意带你一步步创建和测试一个补丁。
0

Juraj,我正在考虑为 Clojure 的 javadoc 创建一个提议的补丁来改进这种情况,并意识到 Clojure 的 javadoc 也试图为 Java 库以外的库计算正确的 URL。

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

对于 Java 本身,是否包含 Java 模块名称的决策因素似乎为 "JDK 是 11 或更高"。我已经确认 JDK 12 文档遵循这个规定。JDK 13 文档目前还没有 Oracle 网站上的 URL,我无法知道那里的计划。

我稍微想了一下,提出了一种可能的可接受的建议改进,但还没有经过任何审查,所以我根本不知道 Clojure 核心团队是否对在 javadoc 中改变行为感兴趣,更不用说在补丁中提出的特定方式了。

https://clojure.atlassian.net/browse/CLJ-2534
一个有趣的解决方案,使用 `JAVA_MODULE_NAME` 占位符,感谢您提交 Jira 工单。
我在那里添加了一段关于可能的 NPE 的说明。
...