2024年Clojure调查问卷中分享您的看法!

欢迎!请查看关于页面以了解更多关于此页面如何工作的信息。

+1投票
tools.deps

当需要执行{{clojure}}的类路径在Windows上足够大时,它可能会超过单个命令行参数的最大大小,从而产生错误{{程序'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”的东西——一个在其MANIFEST.MD中有一个{{Class-Path:}}条目而没有任何其他内容的jar文件。然后可以通过{{java ...

最近我突然想到,路径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}} 将一个命令行标志 {{--cp-jar}} 添加到 tools.deps 的 {{make-classpath}} 部分。当这个文件存在时,tools.deps 将通过将类路径转换为一个以空格分隔的 {{file://}} URL 列表,将这个列表放在 jar 清单中,然后创建一个只包含清单的 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

哦,酷。我将生成针对该内容的另一个补丁并将其附加到这个项目上。

0

评论者:alexmiller

顺便说一下,如果你在 github PR 中,只需在 url 后添加 .patch 即可获取补丁文件。

0

评论者: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报告)
...