0

コードをより適切に整理するために、デフォルトのパッケージの代わりにパッケージを使用するように Eclipse でプロジェクトをリファクタリングしました。多数の Runnable オブジェクトを作成するテスト プログラムがあります。各オブジェクトは互いに順次実行されますが、メイン プログラムと並行して実行されます。

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

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)

このトレースでは、「TweetCleanup」が Runnable クラスで、「Tweet」が見つからないクラスです。TweetCleanup に「common.Tweet」として含めました (common はパッケージです)。別のテスト プログラムを使用して、正常に実行されるメイン スレッドでクラスを認識できるかどうかを確認しました。

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

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

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

乾杯、

P

4

1 に答える 1

3

スレッドの問題はまったくありませんが、何らかの方法でJavaシリアル化を使用していて、「古い」オブジェクトが格納されているストリームからオブジェクトを読み取ろうとしています。

Javaシリアル化によるある種の永続性を使用していて、TweetCleanup-Threadが古い「データベース」を読み取っていると思われます。このファイルを削除すると、プログラムは再び機能します。

パッケージの名前変更またはクラスの移動は、バイナリ互換性のない変更であることに注意してください。このようなオブジェクトを逆シリアル化することはできなくなります。

于 2010-12-14T21:03:49.673 に答える