簡體   English   中英

運行時NoClassDefFoundError Jar

[英]NoClassDefFoundError when running Jar

我有這個問題。 當我在 Intellij 中運行我的代碼時它工作正常,但如果我做一個工件並構建 jar,它就不起作用。 我認為它是由外部庫引起的。 這是我的 output:

Exception in thread "main" java.lang.NoClassDefFoundError: com/mindfusion/scheduling/Calendar
        at GUI.<init>(GUI.java:75)
        at Logfiles.main(Logfiles.java:13)
Caused by: java.lang.ClassNotFoundException: com.mindfusion.scheduling.Calendar
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 2 more

我知道它是哪個 Class 但我不知道如何解決問題。 我真的只是一個初學者。 你能幫我解釋一下嗎? 謝謝

編輯:

在我使用提取的庫構建工件后出現此錯誤:錯誤:發生 JNI 錯誤,請檢查您的安裝並重試線程“main”中的異常 java.lang.SecurityException:清單主要屬性的簽名文件摘要無效

此錯誤僅表示 class 文件不存在於 jar 中。

一種可能的解決方案是您可以下載用於查看 jars的 jd-gui 。您可以使用它來檢查 class 是否存在。

另一種解決方案是您可以使用此簡單命令 grep 在 jar 中搜索 class。

grep -l "<class-name>" <jar-name>.jar

如果 class 不存在於 jar 文件中。 您可以使用 jar 命令添加 class。

jar -cvf <jar-absolute-location> <class-path>
eg : jar -cvf GUI.jar com.mindfusion.scheduling.Calendar

理解這個問題的最簡單方法是閱讀 class 的 Javadoc。來自 Javadoc:

如果 Java 虛擬機或 ClassLoader 實例嘗試加載 class 的定義(作為正常方法調用的一部分或作為使用 new 表達式創建新實例的一部分)並且找不到 class 的定義,則拋出。

編譯當前執行的class時,搜索到的class定義存在,但找不到了。

這意味着當特定的 class 在編譯時出現但在運行時不知何故不可用時,可以拋出NoClassDefFoundError 這可能是由於缺少 JAR 文件、權限問題或運行時的類路徑不正確

通常,當開發人員忽略為使用的庫定義類路徑時,我會看到這些問題。 他們忘記了您的 IDE 有自己的定義類路徑的文件(即 Eclipse 有.classpath文件),因此從 IDE 運行應用程序工作正常(類在編譯時存在),但在編譯應用程序之后類路徑不存在在托管應用程序的機器中定義, NoClassDefFoundError被拋出(運行時類“缺失”)。

如果類路徑正確,我的建議首先被弄清楚。 多於沒有,這就是問題所在。 如果類路徑正確,請確保正確設置了所有權限。

暫無
暫無

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

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