Java RMI ServerException - java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub - PullRequest
0 голосов
/ 24 августа 2011

Я унаследовал некоторый код клиент / сервер Java RMI, и хотя он отлично работает на одном компьютере, я не смог заставить его работать в моей среде разработки.

Проблема заключается в том, что язапустить сервер, используя следующий java.exe -Djava.security.policy=conf\server.policy -SRC;. -Djava.library.path=. org.prog.rmi.RmiServer

Я получаю следующую ошибку:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    ...

Мой server.policy файл

grant {
    permission java.security.AllPermission;
};

И мой код Java:

        package org.prog.rmi;

        import java.rmi.Naming;
        import java.rmi.RemoteException;
        import java.rmi.RMISecurityManager;
        import java.rmi.server.UnicastRemoteObject;
        import java.rmi.registry.*; 

        public class RmiServer extends UnicastRemoteObject 
            implements RmiServerIntf {

        private BatchApi bapi;
        private String iniFileLocation;
        private String layoutOption;
        private int addressCount = 0;
        private RefInt apiHandle = new RefInt();


        public RmiServer(String iniFileLocation,String layoutOption) throws RemoteException 
        {   super();
            this.iniFileLocation = iniFileLocation;
            this.layoutOption = layoutOption;
            initAPI();
            startupAPI();
            openAPI();      
        }

        public static void main(String args[]) 
        {
            System.out.println("RMI server started");

            // Create and install a security manager
            if (System.getSecurityManager() == null) 
            {
                System.setSecurityManager(new RMISecurityManager());
                System.out.println("Security manager installed.");
            }
            else
                System.out.println("Security manager already exists.");

            try  //special exception handler for registry creation
            {
                LocateRegistry.createRegistry(1099); 
                System.out.println("java RMI registry created.");
            }
            catch (RemoteException e)
            {
                //do nothing, error means registry already exists
                System.out.println("java RMI registry already exists.");
            }

            try
            {
                //Instantiate RmiServer
                for (String arg: args){
                    System.out.println(arg);
                }

                RmiServer obj = new RmiServer(args[0],args[1]);

                // Bind this object instance to the name "RmiServer"
                Naming.rebind("//127.0.0.1/RmiServer", obj);
                System.out.println("PeerServer bound in registry");

            } 
            catch (Exception e) 
            {
                System.err.println("RMI server exception:");
                e.printStackTrace();
            }
        }    
}

Я видел решения, относящиеся к java.rmi.server.codebase, но мне тоже не повезло, что он установил

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

После некоторого дальнейшего изучения и следования учебникам RMI оказалось, что существует проблема с сервером регистрации RMI на порту 1099.

Когда я смотрел сервер регистрации RMI на другой порт (например, 2005) и изменил ихстроки кода

LocateRegistry.createRegistry(2005);

и

Naming.rebind("//127.0.0.1:2055/RmiServer", obj);

Это успешно прошло без ошибок, и мой клиент смог подключиться.

Я надеюсь, что этот ответ поможет другим с этой ошибкой,Дайте мне знать, если кому-то понадобится более подробная информация.

0 голосов
/ 26 августа 2011

Вы не регенерировали заглушку с rmic , или Реестр не имеет к ней доступа через путь к классам.

...