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

欢迎!请参阅关于页面了解有关此工作方式的更多信息。

+3
工具命名空间
编辑

我在使用Java 11时遇到了一个 issue,其中tools.namespace(v. 0.3.0)的refresh看起来可以与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 有关,该库随后得到了修复和发布,但版本比 tools.namespace 当前依赖的 java.classpath 需要的版本更高。

我可以创建一个问题来解决 tools.namespace 中的这个问题,但您可以在等待修复的同时,在您的项目中明确添加对较新版本的 java.classpath 库的依赖,并且使用 JDK 11 的话,可能一切都会正常工作。

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

很可能,在您看到的工作正常的项目中,您的一些其他依赖需要更高的 java.classpath 版本。

问题解决了。不知道是否值得在 README 中加一段说明,如果那样的话比推送补丁更容易?知道我需要添加这个依赖一点负担都没有,并且我很乐意这样做。

感谢您诊断这个问题,Andy。我非常感激。
我会更新 tools.namespace。
已发布为 tools.namespace 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问题线程中是否有人能够帮助解释。
...