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

欢迎!有关如何工作的更多信息,请参阅关于页面。

+1
tools.deps

在Windows上,执行{{clojure}}时所需的类路径足够大,可能会超过单条命令行参数的最大长度,从而导致错误{{程序'java.exe'无法运行:文件名或扩展名太长}}。

有关此问题的背景信息,请参阅https://github.com/ajoberstar/ClojureTools/issues/2以及从中链接的其他票据。这实际上是在Windows下基于JVM的开发中相当常见的問題,例如(链接:https://github.com/bazelbuild/bazel/issues/2242文本:Bazel)和(链接:https://tuhrig.de/gradles-bootrun-and-windows-command-length-limit/文本:gradle)。

常用的解决方案是创建一个名为"路径jar"的jar文件,该jar文件在它的MANIFEST.MF中具有{{Class-Path:}}条目,但没有其他内容。然后可以通过{{java ... -classpath pathing.jar clojure.main}}调用Java。

最近我想到,路径jar可以看作是当前在\~/.cpcache/<hash>.cp文件中存在的相同信息,但是以jar文件格式而非文本文件格式。因此,我提出这种解决方案,如果Windows上的类路径过长,Clojure代码中的{{make-classpath}}应生成一个文件~/.cpcache/<hash>.jar,其中包含此信息。在PowerShell方面,主要的{{clojure}}函数可以检查此文件是否存在,如果存在,则通过{{java -cp ~/.cpcache/<hash>.jar clojure.main}}调用(与当前使用<hash>.cp的内容作为其参数的行为相比)。

我认为我应该能够为此提供一个补丁。我在这方面进行了一些尝试,其详细信息可以在上面的ClojureTools票据链接的请求中看到,生成实际jar文件的代码相当简单——一点字符串转换和对{{jar cfm path.jar manifest.txt}}的调用,这可能不是从JVM端必要的。

8 个回答

0

评论者:timgilbert

好的,所以{{0001-Adding-cp-jar-argument.patch}}向tools.deps的{{make-classpath}}部分添加了一个命令行标志{{--cp-jar}}。当此文件存在时,tools.deps将按上述方式生成一个路径jar,通过将类路径转换为用空格分隔的{{file://}} URL列表,将其放入jar清单中,然后创建一个仅包含清单的jar文件。这段代码比我预期的要简单。

这还需要另一部分代码才能正确工作——在{{brew-install}}中的脚本或Windows的等效脚本需要在构建路径时将此标志传递给make-classpath脚本,然后调用{{java -cp .cpcache/1864468523.jar clojure.main}}来实际启动clojure。

我在Windows的powershell和WSL(即Linux)中测试了此代码,通过从repl调用{{(write-pathing-jar "path.jar" (slurp cached-cp-filename))}}进行了测试。之后,我能够通过{{java -cp path.jar clojure.main}}执行Clojure来启动REPL,然后在REPL内部调用{{(require 'clojure.tools.deps.alpha.script.make-classpath)}}以验证我是否可以引入本地命名空间。

0

评论者:timgilbert

我向aoberstar的ClojureTools仓库提交了一个PR,它实现了PowerShell的这一部分,这个补丁和这个补丁的组合解决了我遇到的路径问题。

https://github.com/ajoberstar/ClojureTools/pull/5

0

评论者:alexmiller

ajoberstar的仓库中的所有内容都已应用到主仓库中(包括超出范围的工作),因此最好是到https://github.com/clojure/brew-install/tree/1.10.0上构建补丁。

0

评论者:timgilbert

哦,太酷了。我将为这个PR生成另一个补丁,并将其附加到这个工单上。

0

评论者:alexmiller

顺便说一句,如果你在github PR中,只需将.url添加到自链接中即可获取补丁文件。

0
by

评论者:timgilbert

好的,上面的 {{0002-Calling-cp-jar-to-create-pathing-jar.patch}} 是 brew-install 的补丁,也在 github 上作为 https://github.com/clojure/brew-install/pull/4 提供。

0

评论者:timgilbert

哎呀!这个更新的 0002 补丁修复了之前 brew-install 补丁中围绕 {{ForceCP}} 的语法错误。

0
参考:https://clojure.atlassian.net/browse/TDEPS-120(由 timgilbert 报告)
欢迎来到 Clojure Q&A,在这里您可以提问,并获得 Clojure 社区成员的答案。
...