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”的东西——一个在其MANIFEST.MF中包含{{Class-Path:}}条目但没有其他内容的jar文件。Java可以通过{{java ... -classpath pathing.jar clojure.main}}进行调用。

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

我认为我可以为此提供一个补丁。我在PowerShell方面对此进行了一些实验,具体细节可以在上面提到的ClojureTools工单的链接中看到,实际生成jar文件的代码非常简单——一些字符串转换和调用{{jar cfm path.jar manifest.txt}},这可能不需要从JVM-side调用。

8个答案

0

评论者:timgilbert

好的,所以 {{0001-Adding-cp-jar-argument.patch}} 在 tools.deps 的 {{make-classpath}} 中添加了一个命令行标志 {{–cp-jar}}。当此文件存在时,tools.deps 会对类路径进行转换,生成如下所述的路径 jar 文件:将类路径转换为一个由空格分隔的文件:// 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,并在其中通过 {{(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报告)
...