2011-02-06 51 views
3

我有一個關於javac和Java包的快速問題。如何在軟件包中編譯類,稍後用「java程序」(不帶軟件包名稱)執行它們?

我有一個簡單的程序(我們就叫它Program.java),這是目前在以下目錄:

  • myRepository/myProgram

在Program.java和其他的.java myRepository/myProgram目錄中的文件,我已聲明package myProgram.*並且還包含import myProgram.*;

所以當我輸入javac myProgram/Program.java,它編譯得很好,如果我輸入java myProgram/Program,它運行良好。

但是,我試圖讓目錄中生成.class文件,而不是myRepository/myProgram,這是源文件所在的位置。我試圖javac myProgram/Program.java -d ..產生在myRepository目錄下的.class文件,但是當我嘗試「Java程序」,它給了我下面的錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: Program (wrong name: myProgram/Program).

有什麼辦法辦法,我能得到的.class文件現身在主目錄(myRepository)中,而不是源代碼的位置(myRepository/myProgram),並且能夠在myRepository中執行java Program

回答

0

您應該從myRepository目錄調用編譯器,而不是從包的目錄,如:javac myProgram/Program.java,然後java myProgram.Program

創建的類必須位於類加載器的包結構中才能找到它們(至少使用默認的類加載器)。

你可以把它們放在另一個目錄中,但隨後他們將有權結構那裏,你應該給這個目錄添加到您的虛擬機:

javac -d ../classes myProgram/Program.java 
java -cp ../classes myProgram.Program 

沒有辦法(默認java命令)在包中執行類而不提及包名。

你可以使用一個包裝類,這是在匿名的包(例如,沒有任何package聲明),它只是調用原始類:

class Program { 
    public static void main(String[] args) { 
     // delegate to real main class and method: 
     myProgram.Program.main(args); 
    } 
} 

另外,如果您正在使用IDE開發時,可以通常只需點擊一下按鈕即可啓動程序。

對於分發,您可以將所有類文件放在jar文件中,並在清單中定義主類。然後,你可以打電話給你的程序是這樣的:

java -jar myProgram.jar 
+0

那麼有沒有辦法讓這個我可以只輸入「JAVA程序」,並使其從主目錄中工作時,源代碼是不同的目錄? – FlamesPuck12 2011-02-06 02:40:59

+1

除了編寫一個新的`java`實現,沒有。您可以考慮使用IDE,您只需按下按鈕(或點擊熱鍵)即可編譯並運行您的代碼。 – 2011-02-06 02:46:34

2

你最好穿上目錄源/ myProgram的源代碼,並創建一個名爲build目錄把.class文件。因此,你可以編譯和運行這樣:

javac source/myProgram/Program.java -d build 
cd build 
java myProgram/Program