Проблемы с настройкой простого RMI-сервера - PullRequest
1 голос
/ 25 июня 2011

У меня проблема с настройкой простого сервера RMI, и мне было интересно, может ли кто-нибудь указать мне правильное направление.

У меня есть простой класс Server, который должен экспортировать простой интерфейс.В настоящее время, когда я пытаюсь запустить серверный класс, я получаю следующее исключение:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: prototype.ISimpleService

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

-Djava.rmi.server.codebase=file:C:/Users/John/Documents/NetBeansProjects/Prototype/build/classes

Путь в приведенном выше аргументе указывает на папку верхнего уровня моей иерархии классов, поэтому:

/ classes

/ prototype

-> ISimpleService.class

-> SimpleServiceImpl.class

-> IServer.class

Вот мой код сервера:

public class Server
{
    private static ISimpleService service;

    public static void main(String[] args)
    {
        service = new SimpleServiceImpl();

        try
        {
            ISimpleService stub = (ISimpleService) UnicastRemoteObject.exportObject(service, 0);

            Registry registry = LocateRegistry.getRegistry();

            registry.rebind("SimpleService", stub);

            System.out.println("Simple Service bound");
        } 
        catch (Exception ex)
        {
            System.out.println("Exception binding the simple service");
            ex.printStackTrace();
        }
    }
}

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

Так что я считаю, что мне нужно пропустить что-то простое (без каламбура), чтобы это сработало, но сейчас я ничего не вижу.

У кого-нибудь есть идеи?

Вот полный след стека:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: prototype.ISimpleService
    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)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask    (ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer    (StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at prototype.Server.main(Server.java:35)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: prototype.ISimpleService
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
    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)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask    (ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: prototype.ISimpleService
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    ... 12 more

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

Я решил эту проблему ... Но я потратил немного больше времени, чем ожидал: (

Оказывается, когда вы используете аргумент кодовой базы, как я делал, вы должны ставить в конце завершающий символ "/", если вы указываете на каталог. Как только я добавил это, мой сервер успешно связывается.

Ресурс для этого p см. http://download.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html#section6

0 голосов
/ 25 июня 2011

Кажется, prototype.ISimpleService не в вашем классе.

Попробуйте:

java -cp=C:/Users/John/Documents/NetBeansProjects/Prototype/build/classes;C:/Users/John/Documents/NetBeansProjects/Server/build/classes Server
...