2012-02-08 72 views
15

我觀察到Windows上Java7通配符擴展行爲的奇怪行爲。Windows上Java7命令行的通配符擴展破壞(7?)

幾個世紀以來,「*」與*之間存在明顯的差異。
似乎這不再適用於Java7(至少在Windows7上)。

我注意到使用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或批處理文件設置來控制?

Dieter。

+1

如果您設置了環境變量'_JAVA_LAUNCHER_DEBUG',啓動器將顯示有關展​​開類路徑的其他信息。也許這將有助於瞭解java.exe中發生了什麼。 – Mersenne 2012-02-08 15:03:57

+0

這一個是相關http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7020954 – 2012-02-08 18:40:39

+0

使用'_JAVA_LAUNCHER_DEBUG'還顯示'「*」'衰變: java -cp。回聲「*」 命令行參數: argv [0] = C:\ Program Files \ Java \ jdk1.7 \ bin \ java.exe argv [1] = -cp argv [2] =。 argv [3] =回聲 argv [4] = Echo.class argv [5] = Echo.java – Ditz 2012-02-08 19:16:16

回答

7

是的,我注意到了同樣的問題。

  • 它被解釋爲the release notes for Java7 update 4中的「已知問題」。

  • Here is the bug report。該修補程序將在Java7更新8(當前版本爲更新6)中提供。

  • 請注意,沒有shell選項解決方法,因爲在Windows中,shell不處理通配符擴展。 (而在Unix中,shell執行擴展)。

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並創建一個classpath字符串並將其導出到env變量「tmpCLASSPATH」。