Ich habe gerade ein Projekt in Eclipse umgestaltet, um Pakete anstelle des Standardpakets zu verwenden, um meinen Code besser zu organisieren. Ich habe ein Testprogramm, das eine Anzahl von Runnable-Objekten erstellt, von denen jedes sequentiell, aber parallel zum Hauptprogramm läuft.ClassNotFound Exception in Eclipse beim Starten des Threads mit Paketen in Java
Vor dem Refactoring funktionierte das einwandfrei, wobei jeder Thread pflichtbewusst seine Aufgabe erfüllte. Seit dem Verschieben von Objekten in Pakete erhalte ich jedoch eine ClassNotFound-Ausnahme, sobald eine der Runnable-Klassen versucht, eine Klasse aus einem anderen Paket zu verwenden. Stacktrace folgt:
java.lang.ClassNotFoundException: Tweet
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.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at indexing.TweetCleanup.run(TweetCleanup.java:84)
at java.lang.Thread.run(Unknown Source)
In dieser Spur ‚TweetCleanup‘ ist die Runnable-Klasse und ‚Tweet‘ ist die Klasse nicht gefunden. Ich habe es in TweetCleanup als 'common.Tweet' (wo üblich ist das Paket) enthalten. Ich habe ein separates Testprogramm verwendet, um zu sehen, ob es die Klasse im Hauptthread sehen kann, die erfolgreich ausgeführt wird.
Alles, was mir einfällt, ist, dass dem Thread ein Klassenpfad zur Verfügung gestellt werden muss, um die Tweet-Klasse zu "sehen", dies war jedoch vor dem Refactoring als Paket nicht der Fall. Ich glaube, das Standardverhalten eines untergeordneten Threads besteht darin, den Klassenpfad seines übergeordneten Elements zu verwenden, der 'common.Tweet' enthält.
Ich benutze Eclipse Helios als meine IDE.
Alle Tipps wären willkommen!
Cheers,
P
Ich dachte immer, der Klassenpfad wurde pro Prozess angegeben, weil der Klassenpfad beim Aufrufen des Befehls java angegeben wird. Ich nehme an, Ihre Importe sind alle sortiert, sonst würde es nicht bauen. Sind alle Ihre Pakete im src-Ordner des Projekts angeordnet? (Wenn ja, würde ich erwarten, dass sie auf dem Klassenpfad sind) – chrisbunney
@chrisbunney - Ja, alle sind im Ordner Src. Eclipse hat keine Fehler, es ist nur zur Laufzeit. – codinghands