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.MD中的{{Class-Path:}}条目但没有其他内容的jar文件。然后可以通过{{java ... -classpath 路径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工单中的pull request中查看,而生成实际jar文件的代码非常简单——进行一些字符串转换和调用{{jar cfm 路径.jar manifest.txt}},这可能不需要从JVM端进行。

8 个回答

0

评论者:timgilbert

好的,所以{{0001-Adding-cp-jar-argument.patch}}在这个工具.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,然后在此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报告)
...