2010-02-12 34 views
2

我的Java類組織已經變得有點混亂,所以我正在回顧一些我在Java學習中跳過的內容:類路徑。我無法安靜地讓親愛的班級在我爲他們創建的軟件包中進行編譯。這裏是我的文件夾層次:製作java包

. 
com/ 
    david/ 
     Greet.java 

     greeter/ 
      SayHello.java 
      SayGoodbye.java 

哪裏的SayHello的構造函數只是打印「Hello」和SayGoodbye的版畫「再見」等問候的主要方法只是創建這兩個對象。 SayHello的頂部是package com.david.greeter;同樣與SayGoodbye和Greet的包是com.david;

在greeter文件夾中,我能夠編譯兩個java文件,但是如果我轉到當前目錄(保存com的目錄)並執行javac -cp「com.david.greeter。*」com/david/Greet .java它說它找不到類以及說包com.david.greeter不存在。我也嘗試手動設置$ CLASSPATH。

我在我的智慧結束在這裏,Stackoverflow(正如我通常當我在這裏發佈)。你們中有人知道我做錯了什麼嗎?

回答

5

java編譯器將遍歷類路徑的子目錄,尋找它需要的包。

所以,你的命令行應該如下:

javac -cp "." com/david/Greet.java 

當編譯器看到一個參考com.david.greeter.SayHello在編譯Greet.java將開始在類路徑的目錄和遍歷層次結構尋找它需要的包。

0

如果您是包含COM文件夾中,然後嘗試這個辦法:

javac -cp . com\david\Greet.java 
0

這是不正確(如編譯器已經告訴你):

的javac -cp「com.david .greeter。*

打開命令窗口並導航到包含 「COM」 目錄中。

我覺得你真的想這樣編譯SayHello.java和SayGoodbye.java:

的javac -cp。 。com /大衛/招待員/ * java的

這編譯Greet.java:

的javac -cp。 。com /大衛/ * java的

而這種運行:

java命令。 com.david.Greet

0

「com」目錄不應該是最新的,它應該是當前的子目錄。你需要上一級並再次啓動。此時不需要額外關心類路徑。

1

首先,如Setting the Classpath所述,您當前設置班級路徑的方式是錯誤的。類路徑條目應該是文件名或目錄。所以使用com.david.greeter.*沒有任何意義。其次,當前目錄默認在類路徑中:

默認的類路徑是當前目錄。設置CLASSPATH變量或使用-classpath命令行選項將覆蓋該默認值,因此如果要將當前目錄包含在搜索路徑中,則必須包含「。」。在新的設置中。

所以,如果你執行javac(這裏是man page的方式)從含com的文件夾,你不必調整什麼,只是類型:

javac com/david/Greet.java 

而且javac將通過查找引用的目錄樹(例如SayHello,如果您使用的是Greet)並編譯它們。

順便說一句,如果您必須設置類路徑,請不要使用$CLASSPATH環境變量,但在大多數情況下這只是一個不好的做法,更喜歡-cp選項。