请在 2024 Clojure 调查问卷 中分享您的意见!

欢迎!请查看关于 页面以了解更多关于这个功能的信息。

+3
贡献库
已关闭

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

例如
- (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--

然后在得到的模块上调用 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,因此不应用于11版本之前的JDK。

by
是的,我发现了这个问题。
然而,这并不能改变clojure.java.javadoc/javadoc在JDK 11上对于java.base模块外的类基本上是损坏的事实。
也许本不应该适用于那些类呢?
by
当然,内置的clojure.java.javadoc/javadoc行为在JDK 11上(以及可能不是JDK 12,虽然我还没有尝试)不是访问正确的URL。希望Clojure的后续版本能够改进这一点。

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

Juraj,我正在考虑为Clojure的javadoc创建一个提议的补丁,以改善这种情况,并意识到Clojure的javadoc也尝试计算Java文档的正确URL,包括Java本身的库以外的其他库。

您(或阅读这篇文章的任何人)是否有任何关于是否在Java核心库以外的其他项目中采用了在URL中包含模块名称的想法?

对于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的注释。
...