Ich versuche eine Erweiterung für (dies ist eine kostenlose Java Development Environment
für Anfänger) zu machen. Die Extension soll den Erstklässlern unserer Schule helfen. Die Erweiterung muss eine JAR-Datei sein, die ich in einem Ordner ablegen muss, wo BlueJ
es bei runtime
laden kann. Meine bereits geschriebene Erweiterung kann von dort geladen werden und es funktioniert ohne Probleme.Wie löst man einen NoClassDefFoundError, der durch ClassNotFoundException verursacht wurde?
Nun zu dem Grund, für diese Frage: Ich möchte checkstyle integrieren (dies ist ein Entwicklungstool, um Programmierer zu helfen, Java-Code zu schreiben, der einem Kodierungsstandard folgt.) In meine Erweiterung. Also habe ich die checkstyle jar
in mein Projekt eingefügt und versucht, diese Bibliothek in meinem Code zu verwenden. Wenn ich jetzt ein Glas erzeugen und meine Erweiterung in die BlueJ
Ordner kopieren und BlueJ
aus Finsternis beginne ich die folgende Fehlermeldung erhalten:
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) at bluej.extmgr.ExtensionWrapper.newExtension(ExtensionWrapper.java:209) at bluej.extmgr.ExtensionsManager.loadDirectoryExtensions(ExtensionsManager.java:164) at bluej.extmgr.ExtensionsManager.loadExtensions(ExtensionsManager.java:100) at bluej.extmgr.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) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at java.lang.Class.newInstance(Class.java:442) at bluej.Boot.bootBluej(Boot.java:348) at bluej.Boot.main(Boot.java:175) Caused by: java.lang.ClassNotFoundException: com.puppycrawl.tools.checkstyle.api.CheckstyleException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 14 more
Bei NtbBlueJExtension.java:79
mache ich diese Initialisierung:
`codeAnalysisHandler = new CodeAnalysisHandler();`
Im Innern der CodeAnalysisHandler
Klasse I habe die Einfuhren aus den 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;
Mein ersten allerdings, th Dort sollte ich die Ursache meines Problems finden? Aber dann habe ich keine Ahnung, was ich suchen und wie ich es lösen soll.
Ich habe das Glas in meinen Projekteigenschaften in Eclipse hinzugefügt. Das Glas ist in der Projektstruktur in meinem Ordner lib
. BlueJ
hatte kein Problem, die bluejext.jar
aus dem Ordner "lib" zu laden. Die bluejext.jar
kommt von BlueJ
und wird benötigt, um eine Erweiterung für BlueJ zu schreiben. Ich habe diese Manifest-Datei:
Manifest-Version: 1.0
Main-Class: ch.ntb.sir.ntbbluejextension.NtbBlueJExtension
Class-Path: lib/bluejext.jar lib/checkstyle-all.jar
Ich habe versucht, es zu googeln, fand aber meist Informationen darüber, wie schwierig es ist, den Grund zu finden.
EDIT 1: Ich entpackte meine JAR-Datei zu suchen, wenn die checkstyle-all.jar
wirklich in meiner Erweiterung ist und dort fand ich eine Datei .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>
LÖSUNG: Verwendung von Eclipse Kepler mit die fat jar plugin (Neon war zu neu für das Plugin) und das Projekt mit'Build Fat Jar' exportieren. Danach erschien die'java.lang.ClassNotFoundException' nicht mehr.
Danke für Ihre Hilfe.
Stellen Sie sicher, dass Ihre JAR-Datei checkstyle lib enthält.Überprüfen Sie diesen Link (http://stackoverflow.com/questions/11033603/how-to-create-a-jar-with-external-libraries-included-in-eclipse) für weitere Informationen. –
@ MinhHoàng Ich habe meine Erweiterungs-JAR-Datei entpackt und die checkstyle-all.jar befindet sich im lib-Ordner. Also sollte das in Ordnung sein? – SirArt
@ MinhHoàng Ich habe meine Frage mit einigen neuen Informationen bearbeitet. Vielen Dank. – SirArt