RMI (Resolvido)

Olá,

Estou tentando usar RMI.

Quando eu uso o pacote default para minhas classes funciona, mas quando eu uso um pacote diferente dá erro quando eu rodo a classe do servidor.

Eu faço o seguinte (no console):

1º: Compilo as classes:

D:\TesteRMI\classes> javac testermi.Hello.java
D:\TesteRMI\classes> javac testermi.HelloImpl.java
D:\TesteRMI\classes> javac testermi.HelloClient.java

2º: Gero o stub:

D:\TesteRMI\classes> rmic testermi.HelloImpl

3º: executo o rmiregistry:

D:\TesteRMI\classes> cd testermi
D:\TesteRMI\classes\testermi> rmiregistry

4º: abro uma nova janela do console e executo o HelloImpl

D:\TesteRMI\classes> java testermi.HelloImpl

Neste ponto dá erro:

java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: testermi.HelloImpl_Stub
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385
)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
66)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
.java:707)
        at java.lang.Thread.run(Thread.java:595)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknow
n Source)
        at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
        at sun.rmi.server.UnicastRef.invoke(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Unknown Source)
        at testermi.HelloImpl.main(HelloImpl.java:37)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
ception is:
        java.lang.ClassNotFoundException: testermi.HelloImpl_Stub
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375
)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:4
66)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
.java:707)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: testermi.HelloImpl_Stub
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:242)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
        at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.jav
a:197)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:154
3)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1465)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
698)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1304)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
        ... 9 more

O esquisito é que quando eu faço as mesmas coisas mas uso o pacote default funciona perfeitamente.

Alguém sabe o que pode ser?

Obrigado.

Ae… já descobri qual que era o erro… Era o seguinte:

Eu tenho que rodar o rmiregistry na pasta mais “top level” do pacote, e não na pasta onde estão os .class em si.

Ou seja, tenho que executar o rmiregistry assim:

D:\TesteRMI\classes> rmiregistry

E não assim:

D:\TesteRMI\classes\nomedopacote> rmiregistry

Valeu!