2010-12-14 3 views
0

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

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

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

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

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

Приветствия,

P

+0

Я всегда думал, что путь класса указан для каждого процесса, потому что путь к классам указан при вызове команды java. Я предполагаю, что ваш импорт отсортирован, иначе он не будет построен. Все ваши пакеты расположены в папке src проекта? (если это так, я бы ожидал, что они будут на пути к классу) – chrisbunney

+0

@chrisbunney - да, все находятся в папке src. Eclipse не имеет никаких ошибок, это только во время выполнения. – codinghands

ответ

3

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

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

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

+0

Спасибо за этот объект mhaller - by 'old', вы имеете в виду потенциально файл, который читает OIS? – codinghands

+0

Файл, созданный ObjectOutputStream из предыдущего запуска. – mhaller

+0

Спасибо - проработал шарм :) – codinghands