【发布时间】:2012-02-29 23:48:00
【问题描述】:
我观察到 Windows 上 Java7 的通配符扩展行为的奇怪行为。
几个世纪以来,“*”与 * 之间有着明显的区别。
对于 Java7(至少在 Windows7 上)来说,这似乎不再适用。
我在使用wildcard classpath 时注意到了这个问题。
尽管引用了通配符类路径,但它得到了扩展。
因此,似乎不可能再将通配符传递给 java 应用程序。
所以使用java -cp "somewhere/*" 会失败("somewhere\*" 也是如此)。
一种解决方法似乎是:java -cp "somewhere/*;" 抑制扩展。
为了验证行为,我编写了一个小的 Echo.java 类。
我发现使用 java 1.6.0 引用的“*”和普通 * 可以正常工作, 而在 Java7 上,我总是得到扩展的通配符。 到目前为止,在 Windows7 上观察到了这种情况,不知道在 XP 上会发生什么。
问题出现了,因为 Windows 上的通配符永远不会被黑暗时代的 CMD.EXE 扩展(就像 UNIX 上的任何 shell 一样)。相反,每个可执行文件都必须使用 setargv.obj 显式执行此操作。
我发现两个相关的问题似乎描述了一个类似的问题:
- Multiple command line wildcard expansion confuses Windows users
- setargv.obj wildcard handling broken
这是其他人观察到的吗?
或者是否有一些模糊的 Windows 或批处理文件设置来控制它?
迪特。
【问题讨论】:
-
如果您设置环境变量
_JAVA_LAUNCHER_DEBUG,启动器将显示有关扩展类路径的附加信息。也许这将有助于理解 java.exe 内部发生了什么。 -
使用
_JAVA_LAUNCHER_DEBUG还表明"*"衰减: java -cp 。 Echo "*" 命令行参数:argv[0] = C:\Program Files\Java\jdk1.7\bin\java.exe argv[1] = -cp argv[2] = . argv[3] = Echo argv[4] = Echo.class argv[5] = Echo.java -
谢谢你,@Ditz - 这拯救了我的一天!我正在使用 Maven 的 exec 插件,需要将通配符类路径传递给 JVM(没有 shell globbing)。路径/到/罐子/*;成功了!
-
... 但有一点需要注意 - 如果路径中的任何文件名包含分号(不太可能但可能),这可能会中断。
标签: java windows-7 command-line classpath wildcard