[MW] Aufgabe 4

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

[MW] Aufgabe 4
Sorry, ich muss euch schon wieder mit ner Übungsaufgabe nerven.

Also ich hab jetzt die 4a eingetippt, wollte das ganze ausführen (irgendwo hab ich in Eclipse wohl hingeklickt, plötzlich hat er’s ausgeführt, weiß noch nicht warum), leider hab ich jetzt etliche Seiten voll mit so ner Exception. Irgendwas von Klasse nicht gefunden. Ich vermute jetzt mal, dass ich eine dieser tollen Umgebungsvariablen nicht gesetzt habe und das Programm jetzt seinen eigenen Code nicht mehr findet. (rmiregistry läuft lokal, URL lautet dann “rmi://localhost/mwlibrary”) Hier meine Frage: Ist RMI mit all seinen Umgebungsanforderungen auch Eclipse-tauglich? Kann ich den ganzen Kram da irgendwo eintippen und dann läuft’s? Oder sollte ich mich langsam mal von diesen Klickoberflächen verabschieden und runter auf die Commandline, zu den ganzen anderen Javaprogrammierern kommen?

PS: Wenn mir jemand ne bessere Alternative zu Eclipse anbieten kann, die aufm Mac läuft, die ich einigermaßen legal benutzen darf und die einfacher bedienbar ist, nur zu! :slight_smile:


OK, vergesst die Frage. Ich kann auf meinem Rechner eh nicht weiterarbeiten. Java 1.5 hat kein “rmic” mit installiert, jetzt muss ich dann doch innen CIP mit dem ganzen Kram, und da geht Eclipse net. jedenfalls nicht remote. Ach wie schön, Java, läuft überall… jaja. Ich hoffe da gibt’s sowas, sonst darf ich Java 1.5 wieder in die Tonne treten und den ganzen Kram irgendwie oldschool-kompatibel machen.


Du hast auch schön mit rmic deine Stubs und Skeletons erzeugt? Das macht eclips afaik nicht automatisch. Wenn du dann startest hagelts dann natürlich Class(def)NotFound Fehler.


Habs jetzt nur mal ergoogelt, da ich gerade nicht am Mac sitze:

Note: Since the links in /usr/bin/ point to the tools for J2SE 1.4.2, to invoke J2SE 5.0 tools you must use the full path. For example, to run the J2SE 5.0 version of java use /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Commands/java.

Da gibts keinen rmic? Kann ich mir fast irgendwie nicht vorstellen.


Doch, jetzt wo ich mit find mal die ganze Platte umgegraben hab, isses auch da. locate und Spotlight wollten von Java 1.5 überhaupt nichts wissen. Naja, hab jetzt mal n paar symlinks angelegt, weil es überhaupt keinen Spaß macht, in der Shell bereits ganz rechts das schreiben anzufangen, plus 2 Zeilen voll Befehl. Shell hin oder her, aber da hört’s irgendwo auf. Mit meinen schönen Verzeichnisnamen à la “Übung” kommt das Ding schonmal eh nicht zurecht.


So, nachdem ich jetzt auch noch die ganze Projektstruktur verändert hab, dass Java damit zurecht kommt (bin Microsoft-verwöhnt, da darf man Code ordentlich halten), krieg ich das hier zu sehen:

yves-nb:~/mwlib yves$ javac siyvgoer/mwlibrary/SimpleDBImpl.java 
yves-nb:~/mwlib yves$ rmic -d $CLASSPATH siyvgoer/mwlibrary/SimpleDBImpl 
/Users/yves/mwlib/siyvgoer/mwlibrary/SimpleDBImpl_Stub.java:4: '{' expected.
public final class siyvgoer/mwlibrary/SimpleDBImpl_Stub
                           ^
/Users/yves/mwlib/siyvgoer/mwlibrary/SimpleDBImpl_Stub.java:4: Public class siyvgoer must be defined in a file called "siyvgoer.java".
public final class siyvgoer/mwlibrary/SimpleDBImpl_Stub
                   ^
2 errors

Kann leider nix damit anfangen. Ihr? Die Datei, von der da die Rede ist, existiert bei mir nirgends, kann also nichts zu dem angeblich irgendwo fehlenden “{” sagen.


schreib mal im rmic aufruf punkte bei den packages und keine slashes…


s#/#.#g

bei der Eingabezeile.

Ja, ich finde das auch komisch und nervig.

EDIT: OK, der Thread war schon zu lange unaktualisiert offen…


Ok, rmic hat jetzt funktioniert. Aber was heißt das hier?

yves-nb:~/mwlib yves$ java -Djava.rmi.server.codebase=file:///Users/yves/mwlib siyvgoer.mwlibrary.server.RMIServer
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: siyvgoer.mwlibrary.SimpleDBImpl_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:552)
        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.bind(Unknown Source)
        at java.rmi.Naming.bind(Naming.java:111)
        at siyvgoer.mwlibrary.server.RMIServer.<init>(RMIServer.java:15)
        at siyvgoer.mwlibrary.server.RMIServer.main(RMIServer.java:8)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: siyvgoer.mwlibrary.SimpleDBImpl_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:552)
Caused by: java.lang.ClassNotFoundException: siyvgoer.mwlibrary.SimpleDBImpl_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

Danach passiert nix mehr bis ich ^C drücke.


Deine rmiregistry brauch den classpath zu deinen java files. Ich vermute das es das ist. Ansonsten findet irgendwer anders die .class Dateien nicht.


Wenn da irgendwer irgendwas net findet, warum kann mir dieser welcher nicht einfach sagen, was los ist?! :#:


macht er doch - class not found
Der prüft das halt erst zur Laufzeit. Du könntest ja dynamisch Code dazuladen , dann fände ich es doof, wenn der schon mault, wenn ich das Teil starte.


Wozu braucht’s dann die 2 Seiten da außenrum? Gezielte Verwirrungstaktik? Wie auch immer…

Dank eurer geduldigen Unterstützung hab ich auch schon das nächste Problem: Der Server exportiert ein Objekt vom Typ SimpleDBImpl. Der Client holt sich das Objekt dann ab und castet es in ein SimpleDBImpl. Soweit alles ok, oder? Leider bekomm ich vom RMI ein SimpleDBImpl_Stub zurück, und der lässt sich anscheinend nicht casten. Kann man dem irgendwie beibringen, nur das wieder auszuspucken, was man ihm vorher auch gegeben hat, und nicht irgend ein anderes erfundenes Zeug?


Warum das Impl? Das Interface existiert doch gerade dafür. Also nur SimpleDB exportieren und im Client auch wieder draus machen.


Naja, weil es irgendwie so ähnlich in der Aufgabe steht. Was soll ich denn dann exportieren? SimpleDB ist ein Interface, da kann ich ja schlecht ein Objekt von erstellen, zum Exportieren.


doch kann man :slight_smile:

SimpleDB db = new SimpleDBImpl(filename);
Naming.rebind("rmi://localhost:1099/SimpleDBService", db);

Naja ist das nicht immer noch ein SimpleDBImpl-Objekt? Mal probieren. Seltsames Zeug.


Oh ja stimmt, kann man machen. Wird aber auch net besser. Jetzt bekomm ich die gleiche Exception, nur dass mein RMI-Rückgabeobjekt jetzt kein SimpleDBImpl_Stub mehr ist, sondern vom Typ “$Proxy0”. Nie gehört, du? Ist das überhaupt noch Java-Syntax? (RMIServer und rmiregistry hab ich neugestartet, sonst gab’s andere Fehler.)


Schreib mal die genaue Fehlermeldung.