我注意到javac
和java
選項的區分大小寫似乎有所不同。例如:爲什麼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();
}
}
另請參閱以下批處理文件,該文件使用javac
和java
:
javac -cp bin -sourcepath src -d bin src\Main.java
java -cp bin Main
如果我刪除此項目中的所有預編譯.class
文件,並重新命名稱爲源代碼子文件subf
到SUBF
,然後當我運行該批處理文件上面,我得到一個編譯錯誤,因爲它無法找到包稱爲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上)。
感謝。然而,我仍然很好奇爲什麼與'javac'和'java'一起使用的'-cp'選項會導致我在問題中描述的「相反的結果」。 – user2911290
我認爲答案就是,Java會要求操作系統列出文件/文件夾名稱。用正確的大小寫將名稱報告給Java。然後Java會記住這些名稱,並且當它將字符串與所需的包名進行比較時,它將不匹配,因此它會報告包不存在的錯誤。 –