请在Clojure 2024调查问卷中分享您的想法!

欢迎!请参阅关于页面,了解此工作的更多信息。

+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.MD中包含{{Class-Path:}}条目但没有其他内容的jar文件。然后可以通过{{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的内容作为其参数使用的做法)。

我认为我应该可以为这个问题提供一个补丁。我已经在这方面做了一些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}} 启动一个 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 中,只需将 .patch 添加到 URL,就可以获得补丁文件。

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 报告)
...