Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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

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

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!

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

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

"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

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.

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

Super, danke, hat geklappt! Hab appache runtergeladen & importiert, einpaar andere Sachen haben auch gefehlt.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.