ClassNotFound Исключение в Eclipse при запуске потока, используя пакеты в Java - PullRequest
0 голосов
/ 14 декабря 2010

Я просто реорганизовал проект в Eclipse, чтобы использовать пакеты вместо пакета по умолчанию, чтобы лучше организовать свой код. У меня есть тестовая программа, которая создает несколько объектов Runnable, каждый из которых запускается последовательно друг с другом, но параллельно с основной программой.

До рефакторинга это работало нормально, каждый поток покорно выполнял свою задачу. Однако после перемещения объектов в пакеты я получаю исключение ClassNotFound, как только один из классов Runnable пытается использовать класс из другого пакета. Stacktrace следует:

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 - это пакет). Я использовал отдельную тестовую программу, чтобы увидеть, может ли она видеть класс в главном потоке, который успешно выполняется.

Все, что я могу придумать, это то, что Thread должен быть указан некоторый classpath, чтобы «увидеть» класс Tweet, однако это было не так до рефакторинга как пакетов. Я считаю, что поведение дочернего потока по умолчанию заключается в использовании пути к классу его родителя, который включает в себя «common.Tweet».

Я использую Eclipse Helios в качестве своей IDE.

Любые советы будут оценены!

Приветствия

P

1 Ответ

3 голосов
/ 15 декабря 2010

Совсем не проблема с многопоточностью, но вы как-то используете сериализацию Java и пытаетесь прочитать объект из потока, в котором хранятся «старые» объекты.

Я подозреваю, что вы используете какую-то персистентность с помощью сериализации Java, и ваш TweetCleanup-Thread читает в старой "базе данных". Удалите этот файл, и ваша программа снова заработает.

Обратите внимание, что переименование пакетов или перемещение классов является двоичным несовместимым изменением - вы больше не можете десериализовать такие объекты.

...