Nao sei mais o que fazer, problema com RMI

Pessoal, eu to fazendo um servidor RMI, mas tah dando um erro na hora de executar o servidor.

eu criei um arquivo chamado run.sh, que eh um shellscript que configura o classpath e chama a classe do servidor, segue o arquivo:

[code]CLASSPATH=$CLASSPATH:…/SisGPPrototipo/target
CLASSPATH=$CLASSPATH:./target/
CLASSPATH=$CLASSPATH:./lib/JOmegaConnection.jar
CLASSPATH=$CLASSPATH:./lib/JOmegaReg.jar
CLASSPATH=$CLASSPATH:./lib/mysql-connector-java-5.0.4-bin.jar

#Executa o programa
java -cp $CLASSPATH servidor.Server[/code]

e o codigo do programa servidor (soh a funcao main, o resto eh soh lixo)

public static void main(String[] args) { MysqlServer myServer = new MysqlServer("localhost", "sisGP", "root", ""); DBInterface db = new DBInterface(myServer); try { db.conecta(); Usuario u = new Usuario(); interfaces.BairroManager bm = new servidor.BairroManager(db, u); Naming.rebind("rmi://localhost/BairroManager", bm); }catch (Exception ee){ ee.printStackTrace(); } }

bom, o problema eh o seguinte, na linha:

Naming.rebind("rmi://localhost/BairroManager", bm);

Dah erro, se eu comenta-la, nao dah nenhum erro, o processo inicia e finaliza, sem nenhuma mensagem…

segue aqui o erro:

java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: interfaces/BairroManager at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:382) 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:466) 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(StreamRemoteCall.java:247) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343) at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) at java.rmi.Naming.rebind(Naming.java:160) at servidor.Server.main(Server.java:22) Caused by: java.lang.NoClassDefFoundError: interfaces/BairroManager at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 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:299) 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.java:197) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348) 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:466) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707) at java.lang.Thread.run(Thread.java:595)

Ele tah alegando que o arquivo [u]interfaces/BairroManager[/u] não existe (ClassNotFound), mas se eu comento o codigo do rebind, lah do rmi, nao dah classNotFound, nao to entendo isso!!!

num faltou vc dar o export no CLASSPATH ?

Acho que vc esqueceu mesmio de dar um export no CLASSPATH , mas no lado cliente vc esta com interface: interfaces/BairroManager ?

Eu nao preciso exportar o classpath, eh uma variavel dentro do mesmo shellscript, e ainda por cima, se eu remover a linha do rebind no meu main(), nao dah erro nenhum, entao, o problema nao eh nesse classpath.

Vejam lah onde eu crio a variavel bm,

eu crio ela assim:

interfaces.BairroManager = new servidor.BairroManager(...);

entao, se o problema fosse classpath, essa linha daria erro!

E… para desencargo de consciencia, eu coloquei o export CLASSPATH lah, antes da linha que chama o programa, e mesmo assim contiunou dando o mesmo erro!

Tipo nessa linha:

interfaces.BairroManager = new servidor.BairroManager(...);

prq é packages diferentes ?

Um eh a interface e o outro eh a implementacao da interface…

como vc compilou o Stub pela Interface ?

compilei a implementacao do bairro manager, a interface nao…

assim:

rmic -classpath ../sisGPPrototipo/target:. servidor.BairroManager

e ele gerou um BairroManager_Stub, dentro do package servidor, a interface esta em sisGPPrototipo/target, em um package, assim: interfaces.BairroManager.

Essa eh a declaracao do BairroManager, que tah no package servidor:

public class BairroManager extends UnicastRemoteObject implements interfaces.BairroManager

Eu to achando que eh uma particularidade do rmi no debian, pq eu fiz um teste aki, fiz o seguinte:

criei um metodo main() na implementacao do BairroManager e no meu run.sh, eu troquei de

servidor.Server

para

servidor.BairroManager

e adivinha!

Nao de erro!

Consegui!

Eu coloque os dois caminhos no CLASSPATH global do sistema, agora eu entendi, pq o software rmiregistry nao tava achando a minha classe pq ela tava em outro diretorio, assim, ficando no classpath do sistema, qq um acha!!!

Vc deveria gerar o Stub pela interface , nela ficaria como se diz o proxy apontando para sua implementação quais objetos poderiam acessados remotamente talvez isso era problema

[quote=kemperacc]compilei a implementacao do bairro manager, a interface nao…

assim:

rmic -classpath ../sisGPPrototipo/target:. servidor.BairroManager

e ele gerou um BairroManager_Stub, dentro do package servidor, a interface esta em sisGPPrototipo/target, em um package, assim: interfaces.BairroManager.

Essa eh a declaracao do BairroManager, que tah no package servidor:

public class BairroManager extends UnicastRemoteObject implements interfaces.BairroManager

Agora to com outro problema, jah consegui fazer o RMI funcionar corretamente, porem, eu tenho um servico no servidor, chamado

UsuarioManager, este tem uma funcao, getTheUser, que retorna um objeto do tipo Usuario, porem, quando chamo essa funcao no cliente, ocorre essa excessao:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.io.InvalidClassException: sisgp.Usuario; class invalid for deserialization at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:157) at servidor.UsuarioManager_Stub.getTheUser(Unknown Source) at gui.SisGPClient.main(SisGPClient.java:36) Caused by: java.io.InvalidClassException: sisgp.Usuario; class invalid for deserialization at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:571) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348) at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:290) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:139) ... 2 more

Resolvido!

Errado:

public class Usuario {(...)}

Certo:

public class Usuario implements Serializable {(...)}