带有(Java 调用)通配符扩展的批处理文件在一台 Win 7 计算机上有效,但在另一台计算机上失败

带有(Java 调用)通配符扩展的批处理文件在一台 Win 7 计算机上有效,但在另一台计算机上失败

我正在使用 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.exeWindowsSysWOW64文件夹运行它(而不是默认system32运行时获得的文件夹cmd,或者——看起来——双击批处理文件),它就可以工作了。我的理解(例如,从这个Microsoft Answers 问题) 是运行的是 32 位cmd而不是默认的 64 位(尽管 exe 的位置似乎表明相反!)。我想我仍然需要理解为什么这样做有效(为什么这与引用有关?),以及为什么两台 PC 之间存在差异。

编辑2:实际上,通过 32 位运行它cmd.exe会导致正在执行的 Java 中出现其他问题:请参阅这个 SVNKit 线程。(我猜这导致了某种文件系统权限问题。)我不得不通过更改批处理文件来手动扩展所有 lib JAR 来解决这个问题。不过我仍然想了解这个问题...

答案1

这是 JDK/JRE 中的一个错误,已在 7u10 中修复(我使用的是 7u9):请参阅7u10 发行说明错误报告

我应该更仔细地了解症状告诉我的内容:是 Java(“预处理”)执行通配符扩展,而不是 Windows,并且它正在执行扩展,但随后可能省略了分号或类似内容,因此 Java 看到的-cp a.jar b.jar [other stuff]不是-cp a.jar;b.jar;[...];z.jar [class to run]

正如错误报告中所提到的,显然一种解决方法是使用-cp "MyLibFolder/*;"(即,;在结尾处包含通配符)。

相关内容