1

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.

+0

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. –

+0

@ 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

+0

@ MinhHoàng Ich habe meine Frage mit einigen neuen Informationen bearbeitet. Vielen Dank. – SirArt

Antwort

1

Von Java Document:

The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over Internet protocols

Wenn Sie checkstyle in der Verlängerung Glas aufzunehmen, muss man es in das Haupt Glas explodieren. Werfen Sie einen Blick auf this für weitere Informationen.

Here ist ein Beispiel mit Gradle.

+0

Ok, ich werde das versuchen. Aber das bluejext.jar funktionierte perfekt in meinem Glas genau so, wie ich es beschrieben habe. Ist es möglich, dass diese Lösung mit dem "Fatjar" nur für ein Glas benötigt wird? – SirArt

+0

Dies liegt daran, dass bluejext.jar von bluej bereitgestellt wird, während checkstyle nicht verfügbar ist. Ich denke, es könnte funktionieren, wenn Sie checkstyle-all.jar zum lib-Ordner von bluej hinzufügen. –

+0

Genauer gesagt verwendet bluej nicht das 'bluejext.jar' in Ihrem Erweiterungs-Krug, sondern das im' lib'-Ordner von bluej. –

Verwandte Themen