请在2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获取更多关于这个平台的信息。

+1
工具.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 的内容作为其参数的行为相反)。

我认为我可以为这个问题提供一个补丁。我在上面提到的ClojureTools票据链接中的一些PowerShell端进行了操作,详细信息可以在那里看到,实际生成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将会根据上文描述的方式生成一个路径ing 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发表

哦,酷。我将针对它生成另一个补丁并将其附加到这个条目上。

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