2011-03-21 96 views
5

我有一個叫做Main.java的Java程序,它位於以下目錄:疑難解答的NoClassDefFoundError Java中

/home/user/program/Main.java 

當我嘗試從「程序」目錄中運行Main.java,一切都OK我用這條線:

/home/user/program$ java Main 

但是,當我試圖從主目錄運行Main.java:

/home$ java /home/user/program/Main 

我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main 
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main 

這個錯誤的原因是什麼?

+0

你可以發佈你的主代碼 – GuruKulki 2011-03-21 10:27:40

+0

@svrist OP說它確實有效。 @shaw嘗試設置類路徑'java -cp/home/user/program Main' – Nishant 2011-03-21 10:29:15

回答

10

這是由於您的類路徑,這將默認爲當前目錄。當您從/home/user/program運行java Main時,它會在當前目錄中找到該類(因爲該包似乎未被設置,這意味着它是默認值)。因此,它找到/home/user/program/Main.class中的課程。

運行從/homejava /home/user/program/Main試圖找到在類路徑中類(當前目錄),這將看在/home/home/user/program希望找到包含Main類的定義與包裝.home.user.program文件Main.class

額外的細節:我認爲Java的 啓動正試圖通過 的類名 轉換/ -notation的表示法。是好的;當你運行 java /home/user/program/Main它是 實際爲你運行java .home.user.program.Main。這個 是因爲你不應該指定文件 ,而是指定一個完全指定的 classname(即包括包 說明符)。並且當一個類有一個包時 java期望在 類路徑中的一個目錄(或jar)中找到與 名稱匹配的 目錄結構中的那個類;因此,它會嘗試在 /home/home/user/program尋找類文件

您可以通過-cp-classpath指定你的classpath修復:

java -cp /home/user/program Main 
+0

感謝它的工作! – shaw 2011-03-21 10:38:03

+0

如果你定義了一個包,你可能需要這樣做:'java -cp/home/user/program :.主'額外':.'意味着「和當前目錄。 – 2013-12-28 00:19:19

3

因爲它使用您給出的全名(/ home/user/program/Main)尋找類。您應該只找主類,但用好類路徑: Java的主要-cp /家庭/用戶/程序

這意味着它會搜索Main類在給定的路徑

+0

+1實際回答。 – Nishant 2011-03-21 10:30:45

0

你的第二個命令版本不知道在哪裏找到類。 您需要提供所謂的類路徑

/home$ java -cp userprogram Main 
+0

'-cp user/program'我猜:) – helios 2011-03-21 10:32:39

+0

對 - 我看到/ home/user作爲主目錄 – 2011-03-21 10:34:15

0

因爲你說什麼我斷定這一點:

  • 主要是在 「頂部」(根)包

當你執行java時,你必須指明類路徑,它是你的pakage和classes結構所在的根目錄。

在你的情況下,它是非常/家/用戶/程序。我猜你的類路徑被定義爲「。」 (你所在的目錄)。當你在家中調用java時,類路徑會被誤判。

如果你想使用不同的包裝打電話給你的主在類的頂部聲明軟件包:

package user.program; 

,並設置類路徑爲/ home(或從該目錄執行java)。 接下來調用Java這樣:

java user.program.Main 

使用點,因爲它是一個完整的類名(指示包)。這被翻譯成dirs連接classpath + package + class。舉例:

/home 
user.program -> user/program/ 
Main   -> Main.class 

祝你好運!

+0

感謝您的信息,這讓我更瞭解類路徑是什麼意思 – shaw 2011-03-21 10:42:19

+0

太棒了!我很高興。 – helios 2011-03-25 12:22:14

0

的問題是,如果你調用java /home/user/program/MainMain是,就是要home.user.program,我以爲是不是Main(我想這是在默認包,即沒有)真。在Main的頂部是否有package的聲明?

我建議在其他答案中使用類路徑建議。

0

這個工作對我來說:

java命令的/ home /用戶/程序主要

0

只是前一陣子面對這種(NoClassDefFoundError的)的錯誤。我使用eclipse env在Android應用程序中導入了一些第三方庫。我在運行時遇到了這個錯誤 - 這個第三方庫中的某些類無法找到,並且引發了這個NoClassDefFoundError的結果,儘管提到的庫正確地出現在classpath中,所以我真的不知道還有什麼可以做的解決這個問題。 雖然與「排序和導出」中的「Java構建路徑」標籤打,我把我引進第三方庫在我的項目中所有的庫列表的頂部,並檢查其複選框 - 這解決了問題

0

我試圖編譯和運行時遇到了同樣的錯誤。這本書「Head First Java」解釋並適當解決了這個問題。以下是本書的截圖供您參考。

A screenshot from Head First Java about how to compile and run a java program by including package names.

希望它有幫助。