请在 2024 状态 Clojure 调查问卷 中分享您的想法!

欢迎!有关如何操作的更多信息,请参阅 关于 页面。

+3
贡献库
已关闭

当在 JDK 11 上运行 Clojure 时,clojure.java.javadoc/javadoc 函数无法打开到 java.base 模块之外的 JDK 类的正确 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
 
最佳答案

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

给定一个名为 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 开始,因此不应该在 11 之前的 JDK 上使用。

是的,我发现是这样的。
但是,这并不能改变这样一个事实:在 JDK 11 中,对于 java.base 模块之外的类,`clojure.java.javadoc/javadoc` 的基本功能几乎是无效的。
也许这些本来就不应该有效?
当然,当使用 JDK 11(可能还适用于 JDK 12,但我还没有尝试)时,clojure.java.javadoc/javadoc 的内置行为确实无法访问正确的 URL。如果后续的 Clojure 版本能改进这一点,那就太好了。

我可能抽出时间来为 Clojure 创建一个补丁,但在这期间,我想分享我所学到的东西,以防你需要尝试解决这个问题。如果你感兴趣,我很乐意带你一步步创建和测试补丁。
0
by

Juraj,我正在为 Clojure 的 javadoc 创建一个提议的补丁来改善这种情况,并发现 Clojure 的 javadoc 还尝试计算包含在 Java 中的库之外的其他库的 Java 文档的正确 URL。

您(或任何阅读这篇文档的人)有没有了解这个想法是否被除了核心 Java 库之外的任何项目采用?

对于 Java 本身,是否包含 Java 模块名称的决定性因素似乎是“JDK 是 11 或更高版本”。我已确认 JDK 12 的文档遵循这一规定。JDK 13 的文档在 Oracle 的网站上还没有 URL,因此我还不知道那里的计划。

by
我仔细考虑了一下,提出了一种可能被接受的 Clojure 变更提议,但尚未经过任何审查,所以我不知道 Clojure 核心团队是否对在 javadoc 中更改行为感兴趣,更不用说在补丁中提到的特定方式了。

https://clojure.atlassian.net/browse/CLJ-2534
by
这是一个有趣的解决方案,使用了 `JAVA_MODULE_NAME` 占位符,并感谢你提供的 Jira 票证。
我在那里添加了对可能的 NPE 的注释。
...