簡體   English   中英

在 Linux 上運行程序時的 Java “NoClassDefError”

[英]Java “NoClassDefError” while running the program on Linux

我有一個導入一些 Weka 包的 Java 程序。 我基本上使用“javac -classpath CLASSPATH:weka.jar program_name.java”命令編譯它,一切都很好。

當我使用“java -Xmx2024m -classpath CLASSPATH:weka.jar program_name”運行它時,程序拋出“NoClassDefFound”錯誤,指出找不到主類“program_name”!

這個問題在編譯過程中確實令人費解,並且文件夾中存在program_name.class文件。 weka.jar 也存在。

有人可以告訴我我做錯了什么嗎?

謝謝!

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

您嘗試運行的程序(包括其包名)必須可以從您所在的目錄中導航。

因此,如果您的程序是 com.dave.MyProgram 並且您將其編譯到 /home/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

當 Java 虛擬機無法在運行時找到在編譯時可用的特定類時,就會出現 Java 中的 NoClassDefFoundError。 例如,如果我們有一個來自類的方法調用或訪問類的任何靜態成員,並且該類在運行時不可用,那么 JVM 將拋出 NoClassDefFoundError。 重要的是要了解這與 ClassNotFoundException 不同,后者僅在運行時嘗試加載類時出現,並且名稱是在運行時而非編譯時提供的。 許多 Java 開發人員混淆了這兩個錯誤並感到困惑。

簡而言之,如果類在編譯時存在但在運行時在 java 類路徑中不可用,則會出現 NoClassDefFoundError。 通常,當您收到 NoClassDefFoundError 時,您會在日志中看到以下行:

如何解決 java.lang.NoClassDefFoundError:

Java 解決方案中的 java.lang.NoClassDefFoundError NoClassDefFoundError 的明顯原因是某個特定類在 Classpath 中不可用,因此我們需要將其添加到 Classpath 中,或者我們需要檢查為什么它在 Classpath 中不可用(如果我們期望它可用)。 可能有多種原因,例如:

1) 類在 Java 類路徑中不可用。 2) 您可能正在使用 jar 命令運行您的程序,並且清單文件的 ClassPath 屬性中未定義類。 3) 任何啟動腳本都會覆蓋 Classpath 環境變量。 4) 因為 NoClassDefFoundError 是 java.lang.LinkageError 的子類,如果其中一個依賴項(如本機庫)不可用,它也會出現。 4) 檢查日志文件中的 java.lang.ExceptionInInitializerError。 由於靜態初始化失敗而導致的 NoClassDefFoundError 很常見。 5) 如果您在 J2EE 環境中工作,多個 Classloader 之間 Class 的可見性也會導致 java.lang.NoClassDefFoundError,請參閱示例和場景部分進行詳細討論。

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

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

像這樣

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

用 weka.jar 的路徑替換路徑(除非它與您編譯的路徑在同一路徑中,否則只需放置 .:weka.jar)

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM