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

欢迎!请参阅关于页面以了解更多关于此功能的信息。

+3
工具命名空间
编辑

我遇到了一个问题,tools.namespacerefresh(v. 0.3.0)在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。

这个问题解决了,我 wonder whether it's worth noting in the README, if that's easier than pushing out a patch? Knowing that I need to add that dependency is not a burden, and I'm completely happy to do it.

感谢诊断这个问题,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中也运行。
似乎CIDER将src.zip添加到了类加载器的路径中。
我想知道,是否实际上应该合并这两个类路径,而不是取其一或另一个?
以下是我为参考报告的Cider问题:https://github.com/clojure-emacs/cider/issues/2686


在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进程javadoc产生这一结果的原因,我要等待看是否有人在CIDER问题线程中能提供解释。
...