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

欢迎!请参阅关于页面以获取有关如何操作的一些更多信息。

+3
Contrib libs
已关闭

当在 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中。

+1

给定一个类klass,在Clojure中,您可以使用Java互操作通过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之前的版本。

是的,我发现了这一点。
然而,它并没有改变这样一个事实:`clojure.java.javadoc/javadoc`在JDK 11上对java.base模块外部的类基本上是损坏的。
也许它一开始就不应该对这些类起作用?
当然,Clojure内置的clojure.java.javadoc/javadoc的行为在JDK 11(以及可能不是JDK 12,尽管我还没有尝试)中没有导航到正确的URL。如果能有一个后续的Clojure版本改进这一点就好了。

我可能会有时间为Clojure创建一个补丁,但在此期间,我想分享我所学到的,以防你想尝试这样做。如果你对此感兴趣,我很乐意为你一步一步地讲解创建和测试补丁的步骤。
0

Juraj,我在研究为Clojure的javadoc创建一个提议的补丁以改善这种情况时,意识到Clojure的javadoc还试图为其他不在Java自带库中的库计算正确的URL。

您(或者正在阅读这篇帖子的任何人)是否知道除了核心Java库之外,这个在URL中包含模块名的想法是否被其他项目采用?

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

思考了一会儿后,我提出了一个可能的Clojure修改方案,这可能是可以接受的,但尚未经过任何审查,所以我不知道Clojure核心团队是否有任何兴趣改变javadoc的行为,更不用说在补丁中建议的特定方式。

https://clojure.atlassian.net/browse/CLJ-2534
一个有趣的方法,使用`JAVA_MODULE_NAME`占位符,并感谢你创建的Jira工单。
我在那里添加了一个有关可能的NPE的说明。
...