java.rmi.ServerException: RemoteException произошло в потоке сервера (ClassNotFoundException) - PullRequest
9 голосов
/ 02 марта 2012

Следующий метод:

private void startServer() { // snippet that starts the server on the local machine
    try {
         RemoteMethodImpl impl = new RemoteMethodImpl();
         Naming.rebind( "Illusive-Server" , impl );
    }catch(Exception exc) {
        JOptionPane.showMessageDialog(this, "Problem starting the server", "Error", JOptionPane.ERROR_MESSAGE);
        System.out.println(exc);
    }
}

выдает это исключение: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Interfaces.RemoteMethodIntf

Когда я запускаю свой проект, меня приветствует сообщение в JOptionPane о том, что проблема с запуском сервера, а затем приведенное выше исключение. В чем может быть причина этого?

Я не понимаю, почему в последнем утверждении об исключении указано, что класс не найден, кроме случаев, когда я импортировал нужные пакеты

Ответы [ 4 ]

12 голосов
/ 03 марта 2012

Существует три случая этого исключения.

  1. При экспорте: вы не запустили 'rmic' и не предприняли шаги, описанные в преамбуле для Javadoc дляUnicastRemoteObject, чтобы сделать это ненужным.

  2. При связывании: в реестре нет заглушки, удаленного интерфейса или чего-то, от чего они зависят в своем пути к классам.

  3. при поиске: клиент не имеет этих вещей в своем пути к классам.

Это случай 2. Реестр не может найти указанный класс.

Существует четыре решения:

  1. Запустите реестр с CLASSPATH, включающим соответствующие JAR-файлы или каталоги.

  2. ЗапуститеЗарегистрируйтесь в JVM вашего сервера через LocateRegistry.createRegistry().

  3. Используйте динамические заглушки, как описано в преамбуле к Javadoc UnicastRemoteObject.. Однако вы можете столкнуться с той же проблемой судаленный интерфейс или класс, от которого он зависит, в этом случае 1-3 вышепримените к этому классу / этим классам.

  4. Используйте функцию кодовой базы.Это действительно вариант развертывания, и IMO следует избегать на начальном этапе разработки.

4 голосов
/ 12 сентября 2012
Remote Server Error:RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: mathInterface

Ошибка, которую очень просто решить, чтобы выполнить следующие шаги:

  • Например, ваш Java-файл рассматривается как диск D
  • Запустите диск rmiregistry D (пример D: \ start rmiregistry), затем не запускайте диск rmiregistry на других дисках, это приведет к указанной выше ошибке

(Где бы ни находился ваш файл, начните rmiregistry)

0 голосов
/ 14 февраля 2019

У меня возникла та же проблема, и у меня сработало другое решение. Я запускал два разных проекта IntelliJ с копией интерфейса в каждом проекте. Один из них был в пакете, а другой - нет, и это было причиной этой ошибки.

Решения:

  • Убедитесь, что копии интерфейса не находятся в упаковке.
  • Убедитесь, что копии интерфейса имеют одинаковое имя пакета.
0 голосов
/ 02 июня 2014

Вы можете запустить rmiregistry из любого места, но вы должны убедиться, что скомпилированные классы уже находятся в вашем пути к классам.Например: -

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>set classpath=%classpath%;E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes <ENTER>

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>c: <ENTER>

C:\>rmiregistry

И вышеописанное должно работать нормально.

В общем случае, если вы запускаете rmiregistry из корневого расположения скомпилированных классов (в приведенном выше примере это E: \ ARMSRemoteUpdater\ WebContent \ WEB-INF \ classes), это будет работать, потому что.(точка - текущая директория) уже установлена ​​в вашем classpath.

Но как только вы удалите.(точка - текущий каталог) из вашего classpath, вышеуказанное рабочее условие также не будет выполнено.

Надеюсь, я подробно объяснил.

...