2013-07-12 2 views
0

У меня проблема с приложением Java. Иногда, когда я запускаю свое приложение на сервере Ubuntu, возникает ClassNotFoundException. Я говорил иногда, потому что ошибка появляется случайным образом: иногда через долгое время (и перезапуск приложения исправляет ошибку), иногда в первый раз используется соответствующий класс (и перестраивает приложение, исправляет ошибку).ClassNotFoundException в банке

Обратите внимание, что это не всегда тот же класс, который вызывает ошибку. Также обратите внимание, что я не использую Class.forName() или Classloader.loadClass() или ClassLoader.findSystemClass().

Я бег моего приложения с помощью команды: Java -jar server.jar

Всех классов находятся в файле JAR (я расстегнула его, чтобы проверить) и Manifest является правильным.

Это ошибка, я получаю:

java.lang.ClassNotFoundException: com.edioromeh.server.server2server.S2SDroppedItem at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:266) at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:622) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at com.edioromeh.ub.server.Messenger.run(Messenger.java:44) at java.lang.Thread.run(Thread.java:722)

Моя ява версия: Java версия "1.7.0_15" OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7- 0ubuntu1 ~ 12.04.1) 64-разрядный сервер OpenJDK VM (сборка 23.7-b01, смешанный режим)

Спасибо за помощь!

+1

Класс 'Messenger' из пакета com.edioromeh.ub.server выполняет 'class.forName()', когда он пытается десериализовать объект. Это похоже на то, как RMI работает при передаче объектов по сети. Есть ли сервер, к которому ваше соединение тесно связано? –

ответ

1

Обратите внимание, что при десериализации объекта ObjectInputStream из массива байтов ваше приложение должно зависеть от класса объекта, потому что метод ObjectInputStream.resolveClass вызывал бы java.lang.Class.forName0(), чтобы поток стал объект.

Здесь ваша заявка не зависит от класса под названием «com.edioromeh.server.server2server.S2SDroppedItem»

Вы можете найти .jar файл, содержащий этот класс и поместить его в путь к классам приложения.

Смежные вопросы