[英]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.