ClassNotFound Exception в Eclipse при запуске потока, используя пакеты в Java

StackOverflow https://stackoverflow.com/questions/4444134

Вопрос

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

Прежде чем рефакторировать это нормально, каждый поток покорно выполнял свою задачу. Однако, поскольку перемещение вещей в пакеты я получаю исключение ClassNotFound, как только одна из попыток класса классов использовать класс из другого пакета. 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» находится класс, а «твит» - это класс, который не найден. Я включил его в TweetCleanup как «common.tweet» (где общий пакет). Я использовал отдельную тестовую программу, чтобы увидеть, может ли она увидеть класс в основном потоке, который успешно работает.

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

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

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

Ваше здоровье,

п

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top