(bezieht sich alles auf das Bsp aus dem bekannten (open)book)
Hallo.
Soweit so gut. Ich arbeite das Kapitel "RMI" durch. Das Bsp (der Addierer) sieht auch ganz einfach aus. Schnell ist es eingetippt. Die rmiregistry ist gestartet (reicht doch auch ein Doppelklick auf die .exe?) und dann ein Rechtsklick in Netbeans auf die Server.java und "Run File" auswählen. Da fängt der Ärger auch schon an. Es hagelt nur noch Exceptions. Was mache ich falsch?
ich habe ein ähnliches Problem - bin auch gerade am Durcharbeiten des Kapitels über RMI aus der Javainsel und stosse dabei beim starten des Servers auf folgende Exception:
Code:
Exception in thread "main" java.rmi.UnexpectedException: undeclared checked exception; nested exception is:
java.lang.ClassNotFoundException: Could not find class (Adder) at codebase ()
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at Server.main(Server.java:18)
Soweit ich aus der Exception herauslese, kann die Klasse "Adder", welche das Interface für die Remotemethode darstellt nicht von der Codebase laden. Da diese Klasse allerdings im gleichen Verzeichnis wie der Server liegt, sollte doch zuerst der Classpath greifen und erst anschliessend eine eventuell gesetzte Codebase danach abgesucht werden - auch ein setzen der Codebase property auf den aktuellen Pfad schafft keine Abhilfe.
Die RMI Registry starte ich (wenn manuell) dann mittels "rmiregistry &".
Remote Server: "java egrath.test.Server"
Habe auch schon versuche im Bereich RMISecurityManager angestellt da lt. J2SE Dokumentation der RMI Class Loader keine Klassen lädt wenn kein Security Manager gesetzt ist. Aber auch mit Security Manager und einer vollkommen offenen Policy blieb das Problem bestehen.
Hier noch ein paar Infos über meine SW Konstellation:
VM: Sun HotSpot 1.6.0-b105
O/S: Problem tritt unter Linux und Windows auf.
Hm. Als ich die RMIREGISTRY manuell starten wollte, hat's auch nicht geklappt. Also hab ich'n Bissel rumgeforscht: Keine Ahung warum, aber meine Firewall (Zone Alarm, Windows) hat RMIREGISTRY geblockt, d.h. es ist gelaufen, aber hat nichts bewirkt.
Schau mal, ob deine Firewall das Programm eventuell blockt.
Wenn man bei RedHat die Firewall deaktiviert wird diese zwar im Kernel aktiviert allerdings eben mit einer leeren Policy und default auf Accept. Ist bei der Maschine aber egal da diese ohnehin nur im LAN steht.
1.) Warum es funktioniert wenn man die Registry mittels createRegistry erzeugen lässt:
Die RMI Registry wird in diesem Fall vom gleichen Basisverzeichnis gestartet in deren Unterverzeichnis sich dann die vom Server benötigten Klassen liegen. => Die klassen können von der RMI Registry geladen werden.
2.) Warum es beim händischen starten nicht funktioniert:
Die RMI Registry kann die Klassen nicht finden, wenn diese nicht von jenem Basisverzeichnis aus zu finden sind in welcher die Registry gestartet wurde.
3.) Wie es funktioniert:
Die RMI Registry händisch starten. Dem Server als Property mitgeben von wo die RMI Registry ihre Klassen laden soll: