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

欢迎!请参阅 关于 页面以了解更多关于如何使用本网站的信息。

+3
贡献库
closed

在 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方法确定它所在的模块名称: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基本上是损坏的。
也许它本来就不应该用于这些类?
当然,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 的说明。
...