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

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

+3
Contrib libs
closed by

在 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--

接下来对该模块执行 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之前使用。

by
是的,我也发现是这样的。
然而,这并不改变这样一个事实:“clojure.java.javadoc/javadoc”在JDK 11中(以及可能不是JDK 12,尽管我没有尝试过)对于java.base模块之外的类基本上是损坏的。
也许它一开始就不应该对这些类起作用?
by
当然,clojure.java.javadoc/javadoc在JDK 11(以及可能不是JDK 12,尽管我没有尝试过)中内置行为的问题肯定会导致其链接到正确的URL,这是一个改进的好机会。

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

Juraj,我正在研究创建一个针对Clojure Javadoc的补丁建议,以改善这种情况,并意识到Clojure的Javadoc还尝试计算外部库的正确URL,这些库不包括在Java中。

您(或正在阅读此信息的人)是否有任何想法,是否将包括模块名在内的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的说明。
...