簡體   English   中英

如何解決ClassNotFoundException引起的NoClassDefFoundError?

[英]How to solve a NoClassDefFoundError caused by ClassNotFoundException?

我正在嘗試為BlueJ做一個擴展(這是一個為初學者設計的免費Java Development Environment )。 擴展應該幫助我們學校的一年級學生。 擴展名必須是一個 JAR 文件,我必須將它放在BlueJ可以在runtime加載它的文件夾中。 我已經寫好的擴展可以從那里加載,它可以正常工作。

現在來看看這個問題的原因:我想將checkstyle (這是一種幫助程序員編寫符合編碼標准的 Java 代碼的開發工具。)集成到我的擴展中。 所以我將checkstyle jar放在我的項目中,並嘗試在我的代碼中使用這個庫。 如果我現在生成一個 jar 並將我的擴展復制到BlueJ文件夾並從 Eclipse 中啟動BlueJ ,我會收到以下錯誤:

java.lang.NoClassDefFoundError: com/puppycrawl/tools/checkstyle/api/CheckstyleException at ch.ntb.sir.ntbbluejextension.NtbBlueJExtension.startup(NtbBlueJExtension.java:79) at bluej.extmgr.ExtensionWrapper.safeStartup(ExtensionWrapper.java:533) ) 在 bluej.extmgr.ExtensionWrapper.newExtension(ExtensionWrapper.java:209) 在 bluej.extmgr.ExtensionsManager.loadDirectoryExtensions(ExtensionsManager.java:164) 在 bluej.extmgr.ExtensionsManager.loadExtensions(ExtensionsManager.java:100) 在 bluej.ext .ExtensionsManager.getInstance(ExtensionsManager.java:61) at bluej.Main.(Main.java:101) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:422) 在 java.lang.Class.newInstance(Class.java:442) 在 bluej。 Boot.bootBluej(Boot. java:348) at bluej.Boot.main(Boot.java:175) 由:java.lang.ClassNotFoundException: com.puppycrawl.tools.checkstyle.api.CheckstyleException at java.net.URLClassLoader.findClass(URLClassLoader.java: 381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 14 更多

NtbBlueJExtension.java:79我進行了這個初始化:

`codeAnalysisHandler = new CodeAnalysisHandler();`

CodeAnalysisHandler類中,我從checkstyle libraries導入:

import com.puppycrawl.tools.checkstyle.Checker;
import com.puppycrawl.tools.checkstyle.ConfigurationLoader;
import com.puppycrawl.tools.checkstyle.PropertiesExpander;
import com.puppycrawl.tools.checkstyle.TreeWalker;
import com.puppycrawl.tools.checkstyle.api.AuditEvent;
import com.puppycrawl.tools.checkstyle.api.AuditListener;
import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
import com.puppycrawl.tools.checkstyle.api.Configuration;

我的第一個問題是,我應該在那里找到問題的原因? 但是后來我不知道要搜索什么以及如何解決它。

我在 eclipse 的項目屬性中添加了 jar。 Jar 位於我的lib文件夾中的項目結構內。 BlueJ沒有問題加載bluejext.jar從“Lib”文件夾中。 bluejext.jar來自BlueJ ,並須寫BlueJ的一個擴展。 我有這個清單文件:

Manifest-Version: 1.0
Main-Class: ch.ntb.sir.ntbbluejextension.NtbBlueJExtension
Class-Path: lib/bluejext.jar lib/checkstyle-all.jar

我試圖用谷歌搜索它,但發現的主要信息是關於找到原因的難度。

編輯 1:我解壓我的 JAR 文件來查看,如果checkstyle-all.jar真的在我的擴展中並且我在那里找到了一個文件.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    <classpathentry kind="lib" path="lib/bluejext.jar"/>
    <classpathentry kind="lib" path="lib/checkstyle-all.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

解決方案:使用 Eclipse Kepler 和fat jar 插件(Neon 是新的插件)並使用“Build Fat Jar”導出項目。 之后,“java.lang.ClassNotFoundException”不再出現。

謝謝你的幫助。

Java 文檔

Class-Path 標頭指向本地網絡上的類或 JAR 文件,而不是 JAR 文件中的 JAR 文件或可通過 Internet 協議訪問的類

如果要在擴展 jar 中包含checkstyle ,則必須將其分解到主 jar 中。 看看 這個了解更多信息。

是一個使用 Gradle 的示例。

暫無
暫無

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

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