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)。

通常的解决方案是创建一个称为“pathing jar”的东西 - 一个包含MANIFEST.MF中的{{Class-Path:}}条目而没有任何其他内容的jar文件。此后,可以通过{{java ... -classpath pathing.jar clojure.main}}调用Java。

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

我认为我可以为这个问题编写补丁。我在这上面有一些PowerShell端的尝试,具体细节可以在从上面的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 发布的评论:

我将一个PR提交到了 aoberstar 的 ClojureTools 存储库,实现了 PowerShell 的这一部分,将这个补丁和这个补丁结合起来可以解决我的类路径问题

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

0 投票

由 alexmiller 发布的评论:

aoberstar 的存储库中的所有内容已经应用到主存储库(以及更多的工作),因此最好是构建一个针对https://github.com/clojure/brew-install/tree/1.10.0的补丁

0 投票

由 timgilbert 发布的评论:

哦,酷。我将对那个生成另一个补丁,并将其附加到这个工单上。

0 投票
by

由 alexmiller 发布的评论:

顺便说一句,如果你在github PR中,只需将.url添加到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 投票
by

由 timgilbert 发布的评论:

糟糕!这个更新的0002补丁修复了前一个brew-install补丁中{{ForceCP}}周围的语法错误。

0 投票
by
参考: https://clojure.atlassian.net/browse/TDEPS-120(由timgilbert报告)
...