我正在使用 Windows 批处理文件启动 Java 程序,使用通配符扩展在类路径上设置类似于以下内容的 JAR 文件负载:
java -cp "MyLibFolder\*" com.stupid.StupidProgram parm1
(对于 Windows,需要使用引号,因为这个 StackOverflow 问题。
这在我家里的 Win 7 x64 Home Premium 机器上运行良好,并且用过的在我的工作电脑 (Win 7 x64 Enterprise) 上可以正常工作。但是,它现在在我的工作电脑上抛出一个错误,说它正在尝试在类路径扩展中的一个 JAR 中查找主类。
如果 MyLibFolder 包含a.jar, b.jar, ...., z.jar
,则错误在于无法在 中找到主类b.jar
。
经过一些实验后,它似乎表现得好像双引号已被删除,即它作用于
java -cp a.jar b.jar c.jar [...] z.jar com.stupid.StupidProgram parm1
代替
java -cp "a.jar b.jar c.jar [...] z.jar" com.stupid.StupidProgram parm1
谁能告诉我为什么这种情况可能发生在一台 Win 7 PC 上而不在另一台上?(批处理文件是相同的,通过版本控制共享。)
编辑:啊哈!如果我通过cmd.exe
WindowsSysWOW64
文件夹运行它(而不是默认system32
运行时获得的文件夹cmd
,或者——看起来——双击批处理文件),它就可以工作了。我的理解(例如,从这个Microsoft Answers 问题) 是运行的是 32 位cmd
而不是默认的 64 位(尽管 exe 的位置似乎表明相反!)。我想我仍然需要理解为什么这样做有效(为什么这与引用有关?),以及为什么两台 PC 之间存在差异。
编辑2:实际上,通过 32 位运行它cmd.exe
会导致正在执行的 Java 中出现其他问题:请参阅这个 SVNKit 线程。(我猜这导致了某种文件系统权限问题。)我不得不通过更改批处理文件来手动扩展所有 lib JAR 来解决这个问题。不过我仍然想了解这个问题...