Ява.РМО.UnmarshalException: ошибка unmarshalling аргументы; вложенное исключение: java.ленг.ClassNotFoundException: ServicesTableau

мне нужна ваша помощь вокруг JAVA RMI, я разработал образец программы, используемой для сортировки таблицы. но я получил это исключение:

Erreur RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: ServicesTableau

и это мой исходный код сервера :

public class Serveur {
    public static void main(String args[]) {

        try {

            System.out.println("Server start ...");
            ServicesTableauImpl od = new ServicesTableauImpl();
            String url = "rmi://" + args[0] + "/ServicesTableauImpl";
            System.out.println("Passe");
            Naming.rebind(url, od);
            System.out.println("Attente d'invocations de client / CTRL-C pour stopper");
        } catch (Exception e) {
            System.out.println("Erreur " + e.getMessage());
        }
    /*
    catch(java.net.MalformatedURLException e){
    System.out.println("Mauvais nom de serveur");
    System.exit(1);
    }
    catch(RemoteException e){
    System.out.println("Pas de Rmiregistry");
    System.exit(1);
    }
    */
    }
}

3 ответов


этот класс недоступен в пути к классам реестра RMI. Самый простой способ исправить это-запустить реестр в той же JVM, через LocateRegistry.createRegistry(). сохраните результат в статическом поле.


в некоторых случаях вам нужно переместить код клиентов rmi (интерфейс и main) в пакет по умолчанию. Повторите его на стороне сервера. Это может решить вашу проблему (работа с упаковкой в rmi не так очевидна).


эта ошибка из-за не написания кода security manager, из-за которого класс не может быть загружен. Поэтому убедитесь, что вы добавили код для security manager. 
Если компилятор не находит Security manager, создайте новый.Добавьте код в метод main.

if (System.getSecurityManager() == null) then
    System.setSecurityManager(new RMISecurityManager())