当需要执行{{clojure}}的类路径在Windows上足够大时,它可能会超过单个命令行参数的最大大小,从而产生错误{{程序'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 ...
最近我突然想到,路径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这边并不必要。