Windows 上 Java 7 命令行的通配符扩展损坏(7?)
Posted
技术标签:
【中文标题】Windows 上 Java 7 命令行的通配符扩展损坏(7?)【英文标题】:Broken wildcard expansion for Java7 commandline on Windows(7?) 【发布时间】: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 内部发生了什么。
这个是相关的bugs.sun.com/bugdatabase/view_bug.do?bug_id=7020954
使用_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)。路径/到/罐子/*;成功了!
... 但有一点需要注意 - 如果路径中的任何文件名包含分号(不太可能但可能),这可能会中断。
【参考方案1】:
是的,我注意到了同样的问题。
在the release notes for Java7 update 4 中将其解释为“已知问题”。
Here is the bug report。该修复将在 Java7 更新 8 中提供(当前版本为更新 6)。
请注意,没有 shell-options 解决方法,因为在 Windows 中,shell 不处理通配符扩展。 (而在 Unix 中,shell 执行扩展)。
【讨论】:
【参考方案2】:不是解决 /* 问题的直接解决方案,但我希望您可以使用以下脚本来缓解您的情况。
libDir2Scan4jars="../test";cp=""; for j in `ls $libDir2Scan4jars/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-$#cp > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use ~> java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi;
为 Linux 编写的脚本,也可以为 Windows 提供类似的脚本。如果提供了正确的目录作为“libDir2Scan4jars”的输入;该脚本将扫描所有 jar 并创建一个类路径字符串并将其导出到环境变量“tmpCLASSPATH”。
【讨论】:
以上是关于Windows 上 Java 7 命令行的通配符扩展损坏(7?)的主要内容,如果未能解决你的问题,请参考以下文章