2024 Clojure状态调查!中分享您的观点。

欢迎!请在关于页面获取更多关于此功能的信息。

+3
tools.namespace
编辑

我在使用tools.namespace(版本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 依赖于它,这个问题已经修复并发布,但版本比 tools.namespace 当前所依赖的更高。

我可以在 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问题线程中能提供解释。
...