我在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或批处理文件设置来控制它?
迪特。
答案 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”。