2010-12-14 6 views
0

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

+0

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

+0

@chrisbunney - Ja, alle sind im Ordner Src. Eclipse hat keine Fehler, es ist nur zur Laufzeit. – codinghands

Antwort

3

kein gar Threading Problem, aber Sie verwenden Java Serialisierung irgendwie und Sie versuchen, ein Objekt aus einem Stream zu lesen, die in ihm gespeichert sind „ältere“ Objekte hat.

Ich vermute, dass Sie eine Art von Persistenz durch Java-Serialisierung verwenden, und Ihr TweetCleanup-Thread liest in der alten "Datenbank". Löschen Sie diese Datei und Ihr Programm wird wieder funktionieren.

Beachten Sie, dass das Umbenennen von Paketen oder Verschieben von Klassen eine binäre inkompatible Änderung ist - Sie können solche Objekte nicht mehr deserialisieren.

+0

Danke für diesen mhaller - mit 'älteren' Objekten meinst du möglicherweise die Datei die vom OIS gelesen wird? – codinghands

+0

Die Datei, die von ObjectOutputStream aus einem vorherigen Lauf erstellt wurde. – mhaller

+0

Danke - hat einen Charme :) – codinghands

Verwandte Themen