2010-12-14 11 views
0

Eclipseでプロジェクトをリファクタリングして、デフォルトパッケージの代わりにパッケージを使用してコードを整理しました。私はいくつかのRunnableオブジェクトを作成するテストプログラムを持っています。これらの各オブジェクトはお互いに連続して実行されますが、メインプログラムと並行して実行されます。ClassNotFound Javaでパッケージを使用してスレッドを開始するときにEclipseで例外が発生する

リファクタリングする前に、これはうまく機能し、各スレッドは忠実にそのタスクを実行しました。しかし、パッケージを移動すると、Runnableクラスの1つが別のパッケージのクラスを使用しようとするとすぐにClassNotFound例外が発生します。 「TweetCleanup」このトレースで

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) 

のRunnableクラスであり、そして「さえずる」が見つかりませんクラスです:スタックトレースは次の通りです。私はTweetCleanupに 'common.Tweet'(commonはパッケージ)を含めました。私は別のテストプログラムを使用して、正常に実行されるメインスレッドのクラスを参照できるかどうかを確認しました。

私は考えることができるのは、Tweetクラスのクラスパスを提供する必要がありますが、これはパッケージとしてのリファクタリング前のケースではありませんでした。私は、子スレッドのデフォルトの動作は、 'common.Tweet'を含む親のクラスパスを使用することだと考えています。

私はIDEとしてEclipse Heliosを使用しています。

ヒントをいただければ幸いです!

乾杯、

P

+0

javaコマンドを呼び出すときにクラスパスが指定されているため、クラスパスがプロセスごとに指定されているといつも思っていました。私はあなたの輸入品はすべてソートされていると推測します。そうでなければそれは構築されません。すべてのパッケージはプロジェクトのsrcフォルダ内に配置されていますか? (もしそうなら、私はそれらがクラスパス上にあることを期待します) – chrisbunney

+0

@chrisbunney - はい、すべてsrcフォルダにあります。 Eclipseにはエラーはなく、実行時にのみ発生します。 – codinghands

答えて

3

全然スレッディング問題がありますが、何らかの形でJavaのシリアライズを使用していて、その中に保存された「古い」オブジェクトを持つストリームからオブジェクトを読み取るためにしてみてください。

あなたはJava Serializationによって何らかの永続性を使用していると思っています。あなたのTweetCleanup-Threadは古い「データベース」を読み込んでいます。このファイルを削除すると、プログラムは再び動作します。

パッケージ名の変更やクラスの移動は、バイナリの互換性のない変更であり、このようなオブジェクトをデシリアライズすることはできません。

+0

このmhallerのおかげで、古いオブジェクトは、OISによってファイルが読み込まれている可能性がありますか? – codinghands

+0

前の実行からObjectOutputStreamによって作成されたファイル。 – mhaller

+0

ありがとうございました。 – codinghands

関連する問題