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

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

+3
工具命名空间
编辑

我在运行 refresh(来自 tools.namespace(v. 0.3.0)时遇到了问题,它似乎与 Java 8 一起工作,但不能与 Java 11 一起工作。我尝试了 Clojure 1.10.01.10.1。我能够在干净的虚拟机上重现该问题。在两种情况下,我能够在 Java 8 上重新加载命名空间,但不能在 Java 11 上。

但这很奇怪——在我的其他一些项目中,我可以在 Java 11 上重新加载命名空间。我还没有追踪到差异。(我对于 tools.deps 也很新,所以可能我在那里做了某些错误。)

我在这里整理了一个重现: https://github.com/thomascothran/namespace-repro

我假设这很可能是我的错误,但我只能确定的问题与 Java 版本有关。

参考: https://clojure.atlassian.net/browse/TNS-54

1 答案

+5

选中
 
最佳答案

这是由于依赖于java.classpath库的一个已知问题导致的,该库的名称空间工具依赖,该问题已经修复并发布,但是在比工具名称空间当前依赖的java.classpath版本更晚的版本中。

我可以在工具名称空间中创建一个问题来修复它,但在等待修复之前,您可以在项目中明确添加对较晚版本的java.classpath库的依赖,这可能使JDK 11下的事物正常工作

org.clojure/java.classpath {:mvn/version "0.3.0"}

在您看到的那些事物正常工作的项目中,可能有一些其他依赖项需要较新版本的java.classpath。

这解决了问题。想知道是否应该在README中添加备注,如果这样比推出补丁更容易?知道我需要添加这个依赖项并不算负担,并且我非常愿意这样做。

感谢您诊断这个问题,Andy。我真的很感激。
我将努力更新工具名称空间。
已发布为工具名称空间 0.3.1。
太快了!我已经将版本更新到0.3.1,现在跨所有项目都可以使用。谢谢,Alex。

重新显示
这个实际上在Java 9+上对我不起作用(在Mac OS X上尝试了OpenJDK 9和11)。

这是我从`(clojure.java.classpath/classpath)`得到的结果
```
(clojure.java.classpath/classpath)
(#object[java.io.File 0x7c475f0b "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib/src.zip"])
```

这是`(classpath (clojure.lang.RT/baseLoader))`的结果,因此`(system-classpath)`被忽略。

在JDK 8上正常工作。

编辑:因此这似乎是一个CIDER“问题”——当我尝试纯`lein repl`时,它就可以工作。
看起来CIDER会添加src.zip到类加载器的路径。
我怀疑是不是最好合并这两个类路径,而不是取其一或另一个?
这里是我报告给Cider的问题供参考:https://github.com/clojure-emacs/cider/issues/2686
正如Juraj Martinka所确定的,问题是特定环境中的`(clojure.java.classpath/classpath)`。我在https://github.com/clojure-emacs/cider/issues/2686#issuecomment-531366583添加了我的评论。

Java.classpath在不同环境下已有多个解决方案。当前行为是在https://clojure.atlassian.net/browse/CLASSPATH-8中添加的,以解决Java 9中对类加载器层级的更改。相关行是https://github.com/clojure/java.classpath/blob/68f972cd47adcc248d205265ae352ca4caaa117a/src/main/clojure/clojure/java/classpath.clj#L86-L87

乍一看,Juraj Martinka提出的将两个类路径源合并的建议似乎是一个可行的方案,尽管我对路径可能的重复有所疑问。我还在考虑在更改之前了解CIDER jack-in过程为什么会产生这样的结果。我将等待看是否有人在CIDER问题帖子里提供解释。
...