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

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

+3
tools.namespace
编辑

我在从 tools.namespace 中运行 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当前依赖的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问题线程中提供解释。
...