Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上Java7命令行的中断通配符扩展(7?)_Java_Windows 7_Command Line_Classpath_Wildcard - Fatal编程技术网

Windows上Java7命令行的中断通配符扩展(7?)

Windows上Java7命令行的中断通配符扩展(7?),java,windows-7,command-line,classpath,wildcard,Java,Windows 7,Command Line,Classpath,Wildcard,我观察到Windows上Java7的通配符扩展行为的一个奇怪行为 几个世纪以来,“*”和*”之间有着明显的区别。 对于Java7(至少在Windows7上)来说似乎不再如此 我在使用时注意到了这个问题。 尽管引用了通配符类路径,它还是得到了扩展。 因此,似乎不可能再向java应用程序传递通配符了 因此,使用java-cp“某处/*”将失败(正如“某处\*”) 一个解决方法似乎是:java-cp“某处/*;”,这会抑制扩展 为了验证该行为,我编写了一个小型Echo.java类 我发现使用java

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

几个世纪以来,“*”和*”之间有着明显的区别。
对于Java7(至少在Windows7上)来说似乎不再如此

我在使用时注意到了这个问题。
尽管引用了通配符类路径,它还是得到了扩展。
因此,似乎不可能再向java应用程序传递通配符了

因此,使用
java-cp“某处/*”
将失败(正如
“某处\*”

一个解决方法似乎是:
java-cp“某处/*;”
,这会抑制扩展

为了验证该行为,我编写了一个小型Echo.java类

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

问题出现了,因为Windows上的通配符从未被dark age CMD.EXE扩展过(就像UNIX上的任何shell一样)。相反,每个可执行文件都必须使用显式执行此操作

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

这是别人观察到的吗?
或者是否有一些模糊的窗口或批处理文件设置来控制此操作


迪特尔。

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

  • 这在本书中被解释为“已知问题”

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

  • 请注意,没有shell选项解决方案,因为在Windows中,shell不处理通配符扩展。(而在unix中,shell执行扩展)


这不是解决问题的直接方法,但我希望您可以使用以下脚本来缓解您的情况

 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”

如果设置环境变量
\u JAVA\u LAUNCHER\u DEBUG
LAUNCHER将显示有关扩展类路径的其他信息。也许这将有助于理解java.exe内部发生的事情。这一点与使用
\u java\u LAUNCHER\u DEBUG
相关,还显示
“*”
衰减:java-cp。Echo“*”命令行args: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全局绑定)。路径/to/jars/*;做了这个把戏!…但有一点需要注意:如果路径中的任何文件名包含分号(虽然不太可能,但也有可能),这可能会中断。