我观察到在Windows上,Java7的通配符展开行为有些奇怪。
几个世纪以来,"*"和*之间有一个明显的区别。 然而,在Java7上(至少在Windows7上),这个区别似乎不再存在。
当我使用通配符类路径时,我注意到了这个问题。 尽管对通配符类路径进行了引用,但它仍然被展开。 因此,似乎不再可能将通配符传递给Java应用程序。
所以使用
一个解决方法似乎是:
为了验证这个行为,我编写了一个小的Echo.java类。
我发现,在Java 1.6.0中,引用的"*"和普通的*都能按预期工作, 而在Java7中,我总是得到展开的通配符。 到目前为止,这只在Windows7上观察到,不知道在XP上会发生什么。
问题出现在Windows上,因为黑暗时代的CMD.EXE从不扩展通配符(就像UNIX上的任何shell一样)。相反,每个可执行文件都必须使用setargv.obj来显式执行此操作。
我找到了两个相关的问题,似乎描述了类似的问题: 有其他人也观察到这个问题吗? 还是有一些不为人知的Windows或批处理文件设置可以控制这个问题吗?
Dieter.
几个世纪以来,"*"和*之间有一个明显的区别。 然而,在Java7上(至少在Windows7上),这个区别似乎不再存在。
当我使用通配符类路径时,我注意到了这个问题。 尽管对通配符类路径进行了引用,但它仍然被展开。 因此,似乎不再可能将通配符传递给Java应用程序。
所以使用
java -cp "somewhere/*"
会失败("somewhere\*"
也是如此)。一个解决方法似乎是:
java -cp "somewhere/*;"
,这样可以阻止展开。为了验证这个行为,我编写了一个小的Echo.java类。
我发现,在Java 1.6.0中,引用的"*"和普通的*都能按预期工作, 而在Java7中,我总是得到展开的通配符。 到目前为止,这只在Windows7上观察到,不知道在XP上会发生什么。
问题出现在Windows上,因为黑暗时代的CMD.EXE从不扩展通配符(就像UNIX上的任何shell一样)。相反,每个可执行文件都必须使用setargv.obj来显式执行此操作。
我找到了两个相关的问题,似乎描述了类似的问题: 有其他人也观察到这个问题吗? 还是有一些不为人知的Windows或批处理文件设置可以控制这个问题吗?
Dieter.
_JAVA_LAUNCHER_DEBUG
,启动器将显示有关扩展类路径的其他信息。也许它会帮助您了解java.exe内部发生了什么。 - lxbndr_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