2010-10-05 57 views
2

它已經太長時間,因爲我已經做了最後的Java,我不記得爲什麼會發生以下情況:包在java文件,使類文件unuseable

鑑於此文件,通過一個標準的Maven項目創建,因爲在這裏可以看到:Maven Tutorial

package com.mycompany.app; 

/** 
* Hello world! 
* 
*/ 
public class App 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!"); 
    } 
} 

編譯這一點,甚至沒有與Maven,但與標準的javac可執行文件,會生成沒有錯誤類文件。嘗試運行類文件,並得到此錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: App (wrong name: com/mycompany/app/App) 

刪除包命令,再次編譯,它運行得很好。爲什麼是這樣?我正在運行JDK 1.6.0_21 btw。

+0

......你究竟是怎麼試着跑這個班的? – meriton 2010-10-05 23:28:05

+0

來自命令行:java App – KdgDev 2010-10-06 13:04:20

回答

8

爲類創建package後必須做的一件事是創建嵌套子目錄以表示類的包層次結構。在你的情況下,軟件包名稱是「com.mycompany.app」,因此App.class(已編譯的App.java文件)應駐留在「com/mycompany/app」子目錄中。不過,源文件位於何處並不重要。例如,我抄你的文件,並做了以下內容:

$ ls 
App.java 
$ javac App.java 
$ ls 
App.class  App.java 
$ mkdir -p com/mycompany/app 
$ mv App.class com/mycompany/app/ 
$ java com.mycompany.app.App 
Hello World! 
$ 

瞭解詳情,請閱讀Wikipedia page about Java Packages。您還可以看看這些鏈接:

祝你好運!

0

這是因爲在Java文件系統中的文件映射到類(例如每個公共類必須是在一個單獨的同名文件)和包映射到目錄。

所以,如果你有一類是在com.mycompany.app包就必須在相對於classpath中COM/myCompany的/ app目錄。

你的情況,你應該有一個輸出目錄,說和你應該在/com/mycompany/app/App.java類。然後你創建它,從com/mycompany/app/App.java作爲參數運行並運行javac,而不是com/mycompany/app/App.java。

運行類以類比的方式工作,但你給的類的完全合格的名稱,而不是目錄路徑。

+1

實際上,您必須指定Java文件的文件路徑才能編譯。指定「com.mycompany.app.App.java」不起作用。 – 2010-10-05 23:36:28

+0

同意。儘管如此,它仍然適用於運行一個類。 也編輯了帖子。 – vstoyanov 2010-10-06 00:23:10

0

當您嘗試執行程序,它會尋找在使用本產品指定的路徑類文件。因此,當您在文件中包含聲明時,您的類文件必須位於com/mycompany/app/目錄中(相對於您嘗試運行它的目錄而言);如果它找不到它,你會得到這個異常。

因此,當你刪除包語句,JVM將尋找它在當前目錄,這就是爲什麼它的工作原理(因爲你在其中App.javaApp.class文件存在相同的目錄執行java App)。

0

您需要的COM/myCompany的/ app文件夾添加到您的Java類路徑。如果我還記得,也可以使用參數「-cp」從cmdline執行此操作。