我刚刚在 Eclipse 中重构了一个项目以使用包而不是默认包来更好地组织我的代码。我有一个测试程序,它创建了许多 Runnable 对象,每个对象都按顺序运行,但与主程序并行。
在重构之前,这工作正常,每个线程都尽职尽责地执行其任务。但是,由于将东西移入包中,只要其中一个 Runnable 类尝试使用另一个包中的类,我就会收到 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”是未找到的类。我已将其作为“common.Tweet”包含在 TweetCleanup 中(其中 common 是包)。我使用了一个单独的测试程序来查看它是否可以看到主线程中的类,它运行成功。
我能想到的只是需要为 Thread 提供一些类路径来“查看”Tweet 类,但是在重构为包之前情况并非如此。我相信子线程的默认行为是使用其父线程的类路径,其中包括“common.Tweet”。
我使用 Eclipse Helios 作为我的 IDE。
任何提示将不胜感激!
干杯,
磷