コードをより適切に整理するために、デフォルトのパッケージの代わりにパッケージを使用するように 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