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

欢迎!请查看关于页面,了解更多此网站的工作方式。

+3
tools.namespace
编辑

我在使用 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库的工具命名空间中存在的一个已知问题,这个问题已经被修复并发布,但修复的版本高于工具命名空间当前所依赖的版本。

我可以在工具命名空间中创建一个修复这个问题的问题,但在等待修复的同时,您可以在项目中显式添加对较新版本的java.classpath库的依赖,使用JDK 11可能事物就会正常工作

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

在您所见项目中,某些其他依赖需要较新版本的java.classpath才能正常运行。

这个问题解决了。想知道是否在README文件中添加一个说明会更简单?知道我需要添加这个依赖对我来说根本不是负担,我很乐意做这件事。

感谢你诊断这个问题,Andy。我非常感激。
我将着手更新工具命名空间。
已发布为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的建议——合并两个classpath源——似乎是一个可行的解决方案,尽管我对他可能重复的路径有一些疑问。我还想了解在做出更改之前,为什么CIDER的jack-in过程会产生这样的结果。我将等待看是否有哪位CIDER问题线程上的成员可以对这个解释提供帮助。
...