Zum Inhalt springen

ClassNotFound exception


Empfohlene Beiträge

Geschrieben

Hallo!

Ich arbeite zur Zeit mit Jung und hab eine Klasse die von SparseGraph erben soll. Wenn diese Klasse aber dann benutzt wird, kommt eine Class Not Found Exception. Woran könnte das liegen? Dieser Fehler kommt übrigens ausschließlich wenn ich von Klassen aus einem bestimmten package (jung.graph.impl) erben will.

Geschrieben

"Vermutlich befindet sich das jar Archiv in dem die Klassen aus dem package jung.graph.impl liegen nicht im Klassenpfad."

Doch, natürlich liegt das Jar-Archiv bereits im Klassenpfad (ich habs um die 10 Mal hinzugefügt!): wenn ich von einer Klasse erbe, die aus einem anderen package stammt, z.B. "SparseVertex.java" dann funktioniert es. Ausserdem würde es doch auch zu Kompilierfehler kommen, wenn er die Klasse nicht findet, was ja nicht der Fall ist.

Geschrieben

Du musst zwischen Entwicklungs- und Laufzeitumgebung unterscheiden. Es kann schon sein, dass die Klasse zum Entwicklungszeitpunkt gefunden wird, weil Du sie z.B. in Eclipse in den Build Path mit aufgenommen hast. Wenn Du dann aber zur Laufzeit die Klasse nicht im Klassenpfad hast, dann erhältst Du eben die von Dir genannte Exception.

In welcher Umgebung tritt das Problem denn auf? Application Server? Standalone Anwendung? Und wie fügst Du die benötigte Klasse / das JAR dort zum Classpath hinzu?

Peter

Geschrieben
Doch, natürlich liegt das Jar-Archiv bereits im Klassenpfad
Nö, liegt es nicht. Läge es im Classpath würde die entsprechende Fehlermeldung nicht erscheinen. Von daher gibt's nur die Alternative: Classpath (doch) nicht richtig konfiguriert. Schonmal einen Debugger angeworfen und dir den Classloader angesehen, der versucht die entsprechende Klasse zu laden? Wenn nein: machen!
Geschrieben

"In welcher Umgebung tritt das Problem denn auf?"

Standalone Anwendung

"Und wie fügst Du die benötigte Klasse / das JAR dort zum Classpath hinzu?"

Eclipse: rechter Mausklick auf das Projekt --> Build path --> add external archives.

Das Jar-Archiv: jung-1.7.6.jar, enthält u.a. das package jung.graph.impl & das package jung.graph. Die Klasse die nicht gefunden wird ist von mir geschrieben und heißt Molecule, sie soll von SparseGraph erben, eine Klasse aus dem package jung.graph.impl. Wenn ich sie aber stattdessen von SparseVertex erben lasse, eine Klasse innerhalb jung.graph, tritt der Fehler nicht auf, was heißt dass er dieses Unterpackage aus irgendeinem Grund nicht findet.

Geschrieben

Wo liegt denn Deine geschriebene Klasse? In einem Ordner, der von Eclipse als Source-Folder mit in den Classpath einbezogen wird?

Poste doch mal den exakten Stacktrace Deines Fehlers.

Hast Du perdians Tipp schon befolgt und mal reindebugged?

Peter

Geschrieben

"Hast Du perdians Tipp schon befolgt und mal reindebugged? "

ja, hatte ich schon gemacht:

ClassNotFoundException(Throwable).<init>(String, Throwable) line: 217

ClassNotFoundException(Exception).<init>(String, Throwable) line: not available

ClassNotFoundException.<init>(String) line: not available

ClassLoader.findBootstrapClass(String) line: not available [native method]

Launcher$ExtClassLoader(ClassLoader).findBootstrapClass0(String) line: not available

Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean) line: not available

Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: not available

Launcher$AppClassLoader.loadClass(String, boolean) line: not available

Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not available

Launcher$AppClassLoader(ClassLoader).loadClassInternal(String) line: not available

CovalentBond.bind() line: 28

"Wo liegt denn Deine geschriebene Klasse?"

Die liegt im selben Projekt wo auch die mainMethode liegt.

Stacktrace:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/Predicate

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at java.security.SecureClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.access$000(Unknown Source)

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at java.security.SecureClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.access$000(Unknown Source)

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at molecules.atoms.CovalentBond.bind(CovalentBond.java:28)

at molecules.atoms.Atom.covalentBond(Atom.java:36)

at test.MoleculeVisu.main(MoleculeVisu.java:21)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Predicate

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

... 27 more

Geschrieben

Wie startest du deine Standalone Anwendung denn? Startest du sie aus eclipse heraus oder aus der Kommandozeile? Denn laut Stacktrace werden Klassen vom apache Commons Projekt nicht gefunden.

Solltest du aus eclispe heraus deine Standalone Anwendung starten dann schau dir mal mit "Run -> Run..." deine Launch Configuration an. Da gibt es einen Tab Classpath und hier sollten deine externen jars auch aufgeführt sein.

Geschrieben

Um den Post von Schiller (hoffentlich) noch klärend zu ergänzen: Deine Anwendung mault nicht wegen irgendeiner Deiner Klassen, sondern wegen einer fehlenden apache-commons Klasse. Die Bibliothek, die Du verwendest, benötigt also zur Laufzeit apache-commons. Deshalb kannst Du auch ohne Probleme kompilieren, weil die Abhängigkeit von der Bibliothek ja bei deren Kompilierung aufgelöst wurde. Schau mal nach, was die von Dir verwendete Bibliothek noch alles an Abhängigkeiten hat, da könnte noch mehr sein.

Peter

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...