2014-05-15 14 views
2

我注意到javacjava選項的區分大小寫似乎有所不同。例如:爲什麼javac的-cp選項區分大小寫,但java的-cp選項不是?

區分大小寫javac命令選項?

-cp   Yes 
-sourcepath Yes 
-d   No 

區分大小寫java命令選項?

-cp   No 

至於這四個選項的情況下的靈敏度的例子,可採取下列文件夾結構:

project \ src \ Main.java 
       \ subf \ Sub.java 
     \ bin \ Main.class 
       \ subf \ Sub.class 

Main.java,其示出了小組類正在使用 -

class Main { 
    public static void main(String[] args) { 
     subf.Sub.method(); 
    } 
} 

另請參閱以下批處理文件,該文件使用javacjava

javac -cp bin -sourcepath src -d bin src\Main.java 
java -cp bin Main 

如果我刪除此項目中的所有預編譯.class文件,並重新命名稱爲源代碼子文件subfSUBF,然後當我運行該批處理文件上面,我得到一個編譯錯誤,因爲它無法找到包稱爲subf。因此,javac-sourcepath選項區分大小寫。

(爲了下次測試成功並運行,現有的Sub.class文件需要被移動回bin\subf文件夾)。如果我離開了改名的源代碼subf文件夾SUBF,使源代碼並且將名爲subf的bin類文件夾重命名爲SUBF,然後當我運行該批處理文件時,出現編譯錯誤(can't find package subf),但可執行文件運行正常。因此,javac-cp選項區分大小寫,但java-cp選項不是。 (請注意,根據這個SO問題的標題,這個觀察形成了我的問題的基礎。)

最後,如果我將源代碼SUBF重命名爲subf,這樣可以編譯源代碼,但是將名爲subf的類文件夾保留爲SUBF,然後當我運行該批處理文件時,我不會收到任何錯誤 - 批處理文件編譯並運行。這意味着javac-d選項不區分大小寫,因爲它忽略了類subf文件夾已重命名爲SUBF的事實,因爲在該文件夾內找到的.class文件具有最新的日期戳值。

我已經壓縮了這個簡單的項目下載。它可以找到here(在DropBox上)。

回答

1

當涉及匹配包名和類名時,Java區分大小寫。 全部 Java在這裏區分大小寫。

但是,Windows上的文件系統不區分大小寫。它是case preserving但不區分大小寫。這意味着對名爲A.class的文件的請求會找到一個名爲a.class的文件(如果它存在)。

這解釋了爲什麼Java所做的一些事情似乎忽略了大小寫。 javacjava程序要求提供目錄,操作系統通過忽略大小寫來搜索它。

但是你不能依靠這個永遠是真實的。在另一個不會忽略大小寫的操作系統上,Java可能無法找到在Windows下可以找到的文件。


有一件事你這樣做會影響你的命令的結果:

你應該通過所有的Java文件名編譯器。如果你正在建造ant,這將會爲你完成。

> javac -cp bin -sourcepath src -d bin src\Main.java 
src\Main.java:5: package subf does not exist 
     subf.Sub.method(); 

做這種方式並沒有錯誤:

> javac -cp bin -sourcepath src -d bin src\Main.java src\SUBF\Sub.java 
+0

感謝。然而,我仍然很好奇爲什麼與'javac'和'java'一起使用的'-cp'選項會導致我在問題中描述的「相反的結果」。 – user2911290

+0

我認爲答案就是,Java會要求操作系統列出文件/文件夾名稱。用正確的大小寫將名稱報告給Java。然後Java會記住這些名稱,並且當它將字符串與所需的包名進行比較時,它將不匹配,因此它會報告包不存在的錯誤。 –

相關問題