![](/img/trans.png)
[英]NoClassDefFoundError: … Caused by ClassNotFoundException
[英]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”不再出現。
謝謝你的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.