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?)的主要内容,如果未能解决你的问题,请参考以下文章

在 AIX 中移动只有 2 行的文件

命令历史别名通配符

Linux-2-3.shell之命令补全&通配符

windows批处理学习---01

windows的命令行的一些操作

转载 java定时器时间配置