请在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在不同环境中存在多个解决方案。当前行为是为了解决Java 9中类加载器层次结构的变化而添加的,详细内容可在https://clojure.atlassian.net/browse/CLASSPATH-8中找到。相关代码行位于https://github.com/clojure/java.classpath/blob/68f972cd47adcc248d205265ae352ca4caaa117a/src/main/clojure/clojure/java/classpath.clj#L86-L87

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