Estou fazendo um projeto pra facu e tomando por base o livro Use a cabeça! Java
No livro é indicado dois códigos nos quais eu fiz pequenas modificações para facilitar uma apresentação para o 1º semestre, mas nada que altere a estrutura como descrita no livro
O primeiro que cria uma interface remota. MinhaClasseRemotapackage rmipackage;
import java.rmi.*;
public interface MinhaClasseRemota extends Remote {
public String digaOi() throws RemoteException;
}
e o que cria a implementação. MinhaClasseRemotaImplementada
package rmipackage;
import java.rmi.*;
import java.rmi.server.*;
public class MinhaClasseRemotaImplementada extends UnicastRemoteObject implements MinhaClasseRemota{
/**
*
*/
private static final long serialVersionUID = 1L;
public String digaOi(){
return "Olá, mundo!";
}
public MinhaClasseRemotaImplementada() throws RemoteException{}
public static void main(String[] args){
try{
MinhaClasseRemota x= new MinhaClasseRemotaImplementada();
Naming.rebind("RemoteHello", x);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
o livro indica que deveria entao iniciar o rmic
dei o comando start rmic na pasta bin do jdk e depois
start rmic MinhaClasseRemota na mesma pasta
Depois iniciei o rmiregistry
start rmiregistry
este ficou aberto na minha área de trabalho, ao contrário do rmic que abriu e fechou rapidamente
No tutorial da Sun indica que o rmiregistry nao deveria ficar aberto conforme transcrevo abaixo
This command produces no output (when successful) and is typically run in the background.
Mesmo assim tentei executar o código de MinhaClasseRemotaImplementada no Eclipse e retornou o seguinte erro
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmipackage.MinhaClasseRemota
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:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown 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 rmipackage.MinhaClasseRemotaImplementada.main(MinhaClasseRemotaImplementada.java:20)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmipackage.MinhaClasseRemota
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:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: rmipackage.MinhaClasseRemota
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: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:1531)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
... 12 more
Por causa do erro do rmiregistry imagino que estou procedendo errado, entao algum poderia me indicar a maneira correta de fazer o código rodar? E como já escrevi um código para o cliente como evitar erros na hora de invocar o método remotamente???
Valeu :)
Editando : Apenas para acrescentar que instalei o plugin do RMI para o Eclipse e iniciei por ele o rmiregistry e~quando tento clicar em run as...
Não aparece a opção rmi aplication
E tinha esquecido de mencionar que o rmic não resultou em uma stub e uma skeleton