请分享您的想法,参加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中的类路径过长,{{make-classpath}} Clojure代码应该生成一个包含此信息的文件~/.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中调用{{(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
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报告)
...