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
by
 
最佳回答

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

+1
by

给定一个类 klass,在Clojure中您可以使用Java互操作来使用getModule方法确定它所在的模块名称,该方法是java.lang.Class类的一部分,链接为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上使用。

by
是的,我发现了这一点。
然而,这并不能改变`clojure.java.javadoc/javadoc`在JDK 11上对java.base模块之外的字节码基本上是损坏的事实。
也许它根本不应该支持它们?
by
当然,使用JDK 11(很可能也适用于JDK 12,尽管我没有尝试过)时,clojure.java.javadoc/javadoc的内置行为绝对不会访问正确的URL。如果以后的Clojure版本能在这个问题上有所改进那就更好了。

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

Juraj,我正在考虑为Clojure的javadoc创建一个提案补丁来改善这种情况,并意识到Clojure的javadoc也会尝试为除了Java自带库之外的其他库计算正确的URL。

你(或阅读这)认为这个在URL中包含模块名的想法是否也被除Java核心库之外的其他项目采用?

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

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

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