2013-06-23 49 views
-1

我有一個Java程序,用於導入一些Weka軟件包。我基本上使用「javac -classpath CLASSPATH:weka.jar program_name.java」命令編譯它,並且一切都很好。在Linux上運行程序時發生Java「NoClassDefError」

當我使用「java -Xmx2024m -classpath CLASSPATH:weka.jar program_name」運行它時,程序拋出一個「NoClassDefFound」錯誤,指出無法找到主類「program_name」!

這個問題真的令人費解,因爲編譯工作,並且program_name.class文件存在於文件夾中。 weka.jar也存在。

有人能告訴我我做錯了什麼嗎?

謝謝!

+1

是否缺少$(或取決於OS%)從CLASSPATH聲明的前面? – DaveH

+0

創建'program_name.class'的目錄需要位於類路徑中,例如'-classpath。:$ CLASSPATH:weka.jar'(如果它位於當前目錄中)。 – tom

+0

謝謝你找回傢伙! 「$」引發錯誤。我嘗試了Java Devil建議的內容,但仍然收到NoClassDefFound消息。當我使用Eclipse(Windows)運行它時,該程序正常工作。當我嘗試從終端上運行它時,我遇到了這個問題。 –

回答

2

如何 java -Xmx2024m -classpath %CLASSPATH%:.:<path_to>/weka.jar program_name

你試圖打開的程序來運行(包括包名稱)必須從你的目錄通航。

所以,如果你的程序是com.dave.MyProgram你它編譯成/家庭/ dave/bin,並且weka.jar文件位於/ tmp中。然後你會嘗試

cd /home/dave/bin 

java -Xmx2024m -classpath .:/tmp/weka.jar com.dave.MyProgram 

,這是創建一個包含當前目錄和/tmp/weka.jar類路徑和運行程序的全名。

如果你的程序是不是在一個包中的colland將

java -Xmx2024m -classpath .:/tmp/weka.jar MyProgram 
+0

該程序不在包中。爲了方便起見,我將程序編譯到/home/../folder/weka-3-7-9(即編譯程序時,我在weka-3-7-9目錄中,並且類文件出現了那裏)。 weka.jar和類文件基本上都在同一個目錄中。但是,我仍然得到錯誤。 –

+0

其實,我會在將程序編譯到不同的目錄後嘗試剛剛說的。請給我一點時間。 –

+0

如果他們都在同一個目錄下,並且該類不在包中,則需要確保「。」。在你的類路徑中。您可能還必須使用「;」而不是「:」來分隔班級路徑上的項目。對於windows和Unix機器,分隔符是不同的。如果程序和jar文件在同一個目錄中,並且程序不在包中,並且已經cd到該目錄,那麼您的命令將是java -Xmx2024m -classpath。 MyProgram – DaveH

0

Java中的NoClassDefFoundError出現在Java虛擬機在編譯時無法在運行時找到特定類的時候。例如,如果我們有一個來自某個類的方法調用或訪問某個Class的靜態成員,並且該類在運行時不可用,那麼JVM將拋出NoClassDefFoundError。理解這一點很重要,它不同於ClassNotFoundException,它只是在運行時加載一個類,而在運行時不是在編譯時提供的。許多Java開發人員混淆了這兩個錯誤並且感到困惑。

總之,如果一個類在編譯時存在,但在運行時在java classpath中不可用,則會出現NoClassDefFoundError。通常情況下,你會看到下面的線數,當你得到的NoClassDefFoundError:

如何解決java.lang.NoClassDefFoundError:

java.lang.NoClassDefFoundError在Java中的NoClassDefFoundError的解決方案顯而易見的原因是一個特定的類在Classpath中不可用,所以我們需要將它添加到Classpath中,或者我們需要檢查爲什麼它在Classpath中不可用,如果我們期待它。可能有以下幾種原因:

1)類在Java Classpath中不可用。 2)您可能正在使用jar命令運行您的程序,並且未在清單文件的ClassPath屬性中定義類。 3)任何啓動腳本都重寫Classpath環境變量。 4)因爲NoClassDefFoundError是java.lang.LinkageError的子類,所以如果其中一個依賴項如本地庫可能不可用,它也會出現。 4)檢查日誌文件中的java.lang.ExceptionInInitializerError。由於靜態初始化失敗而導致的NoClassDefFoundError非常常見。 5)如果您在J2EE環境中工作比在多個類加載器中的類的可見性還會導致java.lang.NoClassDefFoundError,請參閱示例和方案部分以獲得詳細的討論。

當java.lang.NoClassDefFoundError出現之前以及如何解析時,我們將看到幾個示例和場景。這可以幫助您排除Java應用程序中NoClassDefFoundError的根本原因。

+1

來源:http://javarevisited.blogspot.co.nz/2011/06/noclassdeffounderror-exception-in.html – tom

0

嘗試編譯和運行提供的路徑,而不是使用CLASSPATH

像這樣

javac -cp .:(path)/weka.jar program_name.java

與路徑替換路徑weka.jar(除非它是在相同的路徑你正在編譯的地方,然後放在:weka。JAR)

還要確保您加載/導入你需要到你的程序的類,例如

Class.forName("what.ever.the.weka.class.you.are.using.is");

+0

謝謝你回來!我嘗試過,但我仍然得到錯誤。該程序工作正常,當我使用Eclipse。如果我使用import語句而不是Class.forName(「...」)是否正常? –

相關問題