Newsgroup: it.comp.java
Titolo: [URGENTE!] RMI Server Exception: non trova la classe stub, anche se c'è!!

Buonasera,
ho un problema cno RMI per un progetto che devo ocnsegnare a breve.
Ho creato un server che semplicemente registra un oggetto sul registro RMI.
Per fare questo sappiamo che serve il file di stub.
Ho generato lo stub e questo si trova nella stessa directory dell'oggetto
remoto da registrare.
Nonostante mi sembri di aver proceduto alla perfezione, all'avvio del server
viene lanciata la seguente eccezione:
----------------------------------------------------------------------
java.rmi.ServerException: RemoteException occurred in server thread; nested
exception is:
 java.rmi.UnmarshalException: error unmarshalling arguments; nested
exception is:
 java.lang.ClassNotFoundException: mypackage.ProxyImpl_Stub
 at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:352)
 at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
 at sun.rmi.transport.Transport$1.run(Transport.java:148)
 at java.security.AccessController.doPrivileged(Native Method)
 at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
 at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
 at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:7
01)
 at java.lang.Thread.run(Thread.java:536)
 at
sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteC
all.java:247)
 at
sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
 at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:350)
 at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
 at java.rmi.Naming.rebind(Naming.java:159)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments;
nested exception is:
 java.lang.ClassNotFoundException: mypackage.ProxyImpl_Stub
 at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
 at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:342)
 at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
 at sun.rmi.transport.Transport$1.run(Transport.java:148)
 at java.security.AccessController.doPrivileged(Native Method)
 at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
 at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
 at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:7
01)
 at java.lang.Thread.run(Thread.java:536)
Caused by: java.lang.ClassNotFoundException: mypackage.ProxyImpl_Stub
 at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
.......................
ecc ecc
----------------------------------------------------------------------------
----------------------
Dove sbaglio??
Tra l'altro, non so se devo settare un classpath per dire al registro dove
cercare le classi (lavoro con JBuilder7).
Datemi una dritta per favore, perché ho una fretta boia!!! 8-O
Grazieeeeeeeee!
Fabio

 ha scritto nel messaggio
news:ap986c$p7q$1...@lacerta.tiscalinet.it...


 magari prima di aviare JB7.
Nella variabile CLASSPATH di sistema ho impostato la cartella delle classi
del server, quella dove c'è il file stub, l'interfaccia remota ecc, ecc.
Non saprei cosa possa essere...
Fabio

Ciao,
vedi sotto.

Qui è il problema. C'è un'istanza di rmiregistry che gira da qualche parte
che non ha lo stub nel classpath.
Se lanci rmiregistry separatamente, devi settare il classpath per farglielo
vedere.
Se lo lanci da JBuilder (adoooonn !) devi trovare il posto per dirglielo.
Simon

 Se lo lanci da JBuilder (adoooonn !) devi trovare il posto per dirglielo.
Ok, perfetto. Immaginavo che fosse un problema di classpath. Il fatto è che
non trovo da nessuna parte le opzioni da inserire all'avvio di rmiregistry.
Tu le sai?
Diciamo che voglio indicargli il path della directory server (nel quale si
trova lo stub), come faccio? Tu come faresti dal prompt dei comandi??
Ti ringrazio tanto!
Fabio

 rmiregistry. 
RMI mette a disposizione anche una nozione un filo diversa - quella di 
codebase - che e' il posto dove un programma che fa lookup/binding di un 
oggetto sa che puo' trovare gli stub da passare ai suoi client o usare. La 
codebase si specifica tramite una property (java.rmi.server.codebase) il 
cui valore e' un URL.
Quindi quando lanci il tuo programma puoi specificare "java -
Djava.rmi.codebase=file:///..blahblahblah MiaClasse ..etc.."
Per i dettagli, vedi 
http://java.sun.com/products/jdk/1.2/docs/guide/rmi/codebase.html
- nei troubleshooting c'e' esattamente il tuo problema, che e' piuttosto 
comune. Anche cercando su google troverai moltissimi esempi al riguardo.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 Djava.rmi.codebase=file:///..blahblahblah MiaClasse ..etc.."
Ok, svelato il mistero. Lavorando con i packages, mi sono incasinato e non
generavo le cartelle giuste entro le quali porre le classi da scaricare
dinamicamente.
Il classpath nel sistema non serve a niente in questo caso, poichè lo
scaricamento delle classi si rifa al codebase. Inoltre non potei impostarlo,
poiché testando client e server nello stesso sistema, il client
ricercherebbe lo stub dapprima nel suo classpath (che è lo stesso del
server!), trovandolo e quindi ingannando la buona riuscita dell'impostazione
client-server (in pratica non servirebbe lo scaricamento dinamico).
Grazie!
Fabio