Avatar billede Slettet bruger
04. marts 2004 - 20:50 Der er 7 kommentarer og
1 løsning

RMI Problemer, ClassNotFoundException

Hejsa eksperter,

Jeg sidder og er ved at forsøge på at få noget RMI til at fungere.... jeg HAR gjort følgende...

Skrevet et interface-indeholdende alle de metoder der skal kunne "fjern"-kaldes, og ladet dette implementere interfacet Remote...

Derefter har jeg lavet en implementation af interfacet, sat klassen til at nedarve fra UnicastRemoteObject og ladet den smide en masse exceptions, etc...

Så compiler jeg "skidtet" med javac.exe, og derefter danner jeg _stub-filer med rmic.exe,. Så skal jeg til at binde-skidtet på RMIregistry (og teste om det har fungeret)...

Dette gør jeg ved at starte RMIREGISTRY, og derefter eksekvere følgende kode-stump...:

String[] bindings = new java.lang.String[0];
        try {
            Naming.rebind("ost", new CommunicationHandlerImpl(3));
            bindings = Naming.list("");
        } catch (RemoteException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (MalformedURLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        for (int i =0;i<bindings.length; i++) {
            System.out.println(bindings[i]);
        }

Men nu får jeg denne "ClassNotFoundException", også selvom mit IDE har sat enviroment-variabler (classpath, etc.) korrekt op... Jeg er MEGET forvirret...

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: technicalServices.remote.presenter.impl.CommunicationHandlerImpl_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:701)
    at java.lang.Thread.run(Thread.java:534)
    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:350)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:160)
    at Test.main(Test.java:102)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at com.intellij.rt.execution.application.AppMain.main(Unknown Source)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: technicalServices.remote.presenter.impl.CommunicationHandlerImpl_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:701)
    at java.lang.Thread.run(Thread.java:534)
Caused by: java.lang.ClassNotFoundException: technicalServices.remote.presenter.impl.CommunicationHandlerImpl_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:219)
    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:631)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
    ... 9 more
Process terminated with exit code 0
Avatar billede simonvalter Praktikant
04. marts 2004 - 21:13 #1
jeg tror at du skal have et parameter med når du kører det

feks.
-Djava.rmi.server.codebase=file:C:\projekt\classes\
Avatar billede Slettet bruger
04. marts 2004 - 21:14 #2
DOHHHH....

Man skal starte RMIRegistry fra roden af sin applikation

Jeg lukker her :-)
Avatar billede Slettet bruger
04. marts 2004 - 21:15 #3
Hrmmm, og jeg skal lære at ligge et svar!!! Samt refreshe min broser noget oftere :-)
Avatar billede simonvalter Praktikant
04. marts 2004 - 21:17 #4
nej du skal vist nok helst ikke gøre dette, der kan opstå problemer når din stub er i classpath.
ved at sætte codebase er det ikke nødvendigt.
Avatar billede simonvalter Praktikant
04. marts 2004 - 21:19 #5
check selv "Start the Server"
http://java.sun.com/docs/books/tutorial/rmi/running.html
hvis jeg altså har forstået det rigtigt.
Avatar billede arne_v Ekspert
04. marts 2004 - 21:29 #6
Stub skal ganske rigtigt bruges af rmiregistry.

Den officielle SUN dokumentation fraråder at putte stub i classpath.

Men så vidt jeg forstår er det noget der er skrevet af hensyn til applets
for en del år siden.

Hvis stub er i classpath for client også, så virker det fint med stub i
classpath til rmiregistry.
Avatar billede simonvalter Praktikant
04. marts 2004 - 21:46 #7
ok, men giver det mening at starte rmiregistry i roden af sin application, man kunne jo have flere applicationer kørende og de skal vel nødvendigvis ikke have hver deres rmiregistry.
Avatar billede arne_v Ekspert
04. marts 2004 - 22:01 #8
I mere professionel sammenhæng vil alle class filer ligge i en jar fil, så
der ikke rigtigt er nogen rod. Så skal whatever bare pege på den rette jar fil.

rmiregistry er ganske rigtigt designet til at supportere mange server
applikationer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester