2017-10-18 65 views
1

我想知道爲什麼下面的步驟正在工作。爲什麼javac接受用不正確的樹結構來編譯包聲明的類

比方說,實際的文件結構爲:

- src 
    - Toto.java 

文件Toto.java包含

package myPackage; 
class Toto{} 

official javac specification狀態

安排反映目錄樹的源文件的包 樹。例如,如果所有源文件都位於\ workspace中,則 將com.mysoft.mypack.MyClass的源代碼放置在/ workspace中,位於 \ workspace \ com \ mysoft \ mypack \ MyClass.java中。

我認爲

$ cd src 
$ javac Toto.java 

將輸出錯誤。 相反,編譯器不會產生錯誤並編譯正確的文件。

顯然,

cd src 
javac PokerQ/Affichage.java 

javac PokerQ/Affichage.java 

不進行編譯。

回答

2

原則上,您不需要將源文件放入與包層次結構匹配的樹中。編譯器將編譯每個類並在內部存儲包名。無論您如何組織源目錄,每個生成的.class文件都會知道它對應的包。

潛在的問題是,如果你編譯多個類,那麼這些類中的一些將最有可能互相引用。當一個類引用另一個類時,編譯器和JRE使用目錄層次結構作爲找到類的一種手段。默認情況下,編譯器將編譯的.class文件放置在與其Java源相同的目錄中。如果源目錄是greglyy-piggledy,那麼最終會生成一組.class文件,這些文件本身並不是根據軟件包來構建的,這將很難找到它們。您可能仍然能夠通過在您的javacjava命令行中仔細設置類搜索路徑來解決問題 - 如果您真的想這樣做。此外,如果您使用-d <path>指定編譯器的目錄,那麼它將構造一個與包層次結構相匹配的編譯類樹,但是源代碼會混雜在一起。我不確定是否有人使用默認方法,即將編譯後的類放入與源相同的目錄中,原則上可以構建一個相當複雜的多包Java應用程序,其中所有源文件都位於相同的目錄 - 假設你可以跟蹤它們。

儘管如此,源代碼樹與包層次結構相匹配的想法在Java開發方法論中堅定不移,無論它是否絕對必要。像Ant和Maven這樣的IDE工具和構建工具都假定這個組織,所以你必須有點血腥,才能以其他方式工作。

相關問題