Windows 7上Java 7命令行的通配符断开(7?)

时间:2012-02-08 14:19:25

标签: java windows-7 command-line classpath wildcard

我在Windows上观察到Java7的通配符扩展行为的奇怪行为。

几个世纪以来,“*”与*之间存在明显差异。
对于Java7来说,这似乎不再适用(至少在Windows7上)。

使用wildcard classpath时发现了问题。
尽管引用了wildcard-classpath,它仍然被扩展。
因此,似乎不可能再将通配符传递给java应用程序。

因此使用java -cp "somewhere/*"会失败("somewhere\*"也是如此)。

解决方法似乎是:java -cp "somewhere/*;"禁止扩展。

为了验证我写了一个小Echo.java类的行为。

我发现使用java 1.6.0引用“*”和plain *就像预期的那样工作 而在Java7上,我总是得到扩展的通配符。 到目前为止,这在Windows7上被观察到,不知道XP上会发生什么。

问题出现了,因为Windows上的通配符永远不会被黑暗时代CMD.EXE扩展(就像UNIX上的任何shell一样)。相反,每个可执行文件都必须使用setargv.obj显式执行此操作。

我发现了两个似乎描述类似问题的相关问题:

其他人是否观察到了这一点?
或者是否有一些模糊的Windows或批处理文件设置来控制它?

迪特。

2 个答案:

答案 0 :(得分:7)

是的,我注意到了同样的问题。

  • 它被解释为the release notes for Java7 update 4中的“已知问题”。

  • Here is the bug report。该修复程序将在Java7更新8中提供(当前版本为更新6)。

  • 请注意,没有shell-options解决方法,因为在Windows中,shell不处理通配符扩展。 (在Unix中,shell执行扩展)。

答案 1 :(得分:0)

不是破解/ *问题的直接解决方案,但我希望您可以使用以下脚本来缓解您的情况。

 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并创建一个类路径字符串并将其导出到env变量“tmpCLASSPATH”。