Stubs/Skeleton - Erzeugung schlägt stets fehl

Leonidas82

Mitglied
Hallo Community,

bin gerade etwas am verzwifeln ^^.

Ich arbeite mich zur Zeit wieder in RMI ein, da ich für meine Firma ein Programm schreibe.

Ich benutze Netbeans Ver. 6.7 und Java 5.

Habe zum WIedereinstieg ein kleines Programm herausgeholt das ich vor einigen Jahren während des Studiums geschrieben habe. Damals allerdings mit Ecplise und einem RMI Plugin, dass die Stubs/Skeletons beim kompilieren mit erzeugt hat.

zum Problem:
Ich schaffe es einfach nicht, via rmic die Proxie-Objekte zu erzeugen (via Kommandozeile/Windows). Als parameter übergeben ich die Implementation der Serviceklasse (also jene, die das Interface implementiert). Jedoch erhalte ich stets die Fehlermeldung, dass die class nicht gefunden werden kann ?!?!

Zudem habe ich gelesen, dass ab java V5 und größer die Proxies nicht mehr separat erzeugt werden müssen?! Mein Programm müsste dann jedoch funktionieren - tut es aber nicht.

Damals lief es einwandfrei...hoffe jemand kann mir helfen...

VG
 

Leonidas82

Mitglied
Wenn ich mein Programm kompiliere, scheint dies ohne weiteres und vor allem ohne Fehler zu funktionieren (Programm selbst ist semantisch als auch syntaktisch korrekt da dies ja bereits einige Jahre zuvor funktionierte).
Versuche ich allerdings den Server zustarten, der dann den Dienst in der Registry anmelden will, erhalte ich folgende Fehlermeldung (diese ist meines Erachtens auf das Nichtvorhandensein des Stubs/Skeletons zurück zu führen):

Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:160)
at server.RMIServer.main(RMIServer.java:14)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 6 more


WIe gesagt, dass sind typische Fehlermeldungen wenn die Proxieklassen fehlen.

WIe funktioniert das wenn man diese seit Version 5 nicht mehr explizit erzeugen muss? Wie muss ich meine Applikation kompilieren bzw. starten, damit es wieder wie früher läuft?

Alternativ - wie werden die Stubs/Skeleton Klassen manuell erzeugt? Mit dem rmi-compiler auf Kommandozeilenebene (rmic.exe) erhalte ich stets die Fehlermeldung, dass die implementierende Klasse nicht gefunden wurde.

DIe Klasse die ich als Parameter übergeben liegt kompiliert als .class-DAtei vor und wird ohne die Endung .class an rmic übergeben...funzt jedoch nicht ?!?!
 

Leonidas82

Mitglied
Kann mir denn keiner in dieser Sache einen kleinen TIp geben?

Mir wäre lediglich wichtig, wie man eine RMI Anwendung ab Java Version 5 oder höher zum laufen bringt, ohne vorher explizit Stubs/Skeletons zu erzeugen.

Alternativ eine ANleitung, wie die Stubs erzeugt werden - mir schlägt dieser Versuch leider stets fehl (via rmi-compiler)

Danke schnmal für die Hilfe...
 

Ein Keks

Bekanntes Mitglied
bei mir funzt es so:
Java:
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
ServerImpl obj = new ServerImpl();
Server stub = (Server)UnicastRemoteObject.exportObject(obj, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("irgendein name", stub);

Server ist ein Interface und ServerImpl die Implementierung davon
 

Leonidas82

Mitglied
Ich habe nun versucht die Serverklasse so anzupassen, wie dies Ein_Keks vorschlug - ich erhalte nun zwar wieder eine Fehlermeldung beim starten / kompilieren, jedoch schein ich nun einen Schritt weiter zu sein. Rmiregistry läuft im Hintergrund.

Was kann die folgende Fehlermeldung bedeuten?

Exception in thread "main" java.rmi.server.ExportException: Listen failed on port: 1099; nested exception is:
java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:312)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:218)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:393)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:129)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:190)
at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:92)
at sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:78)
at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:186)
at server.RMIServer.main(RMIServer.java:21)
Caused by: java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:97)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(RMIDirectSocketFactory.java:27)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(RMIMasterSocketFactory.java:333)
at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:649)
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:299)


Die Klasse meines Servers die den Dienst bei der registry registriert schaut nun folgendermaßen aus:

Java:
package server;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


import java.rmi.server.UnicastRemoteObject;
public class RMIServer {
	public static void main(String[] args) throws RemoteException, MalformedURLException {

            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            IStungenplanManagement stdmgr=new StundenplanMgmImpl();
            IStungenplanManagement stub = (IStungenplanManagement)UnicastRemoteObject.exportObject(stdmgr, 0);

            Registry registry = LocateRegistry.getRegistry();
            registry.rebind("irgendein name", stub);
	}
}
 

tfa

Top Contributor
Wie schon gesagt wurde, brauchst du ab Java 5 keine Stubs mehr explizit zu erzeugen, ob nun durch Plugin oder manuell.
 

Leonidas82

Mitglied
Ja das ist korrekt - dennoch muss ich ja scheinbar noch irgendwas zusätzliches machen - immerhin schlägt der Versuch des Server(wie oben gepostet) fehl.

Stimmt vielleicht noch etwas mit dem Classpath noch nicht? Müssen hier bestimmte Verzeichnisse oder ggf. noch spezielle Bibliotheken mit in das Projekt eingebunden werden, die in Java 5 hinzu gekommen sind und die automatische Generierung der Stubs/skeletons übernehmen?
 

fastjack

Top Contributor
Eigentlich nicht. Aber bist Du Dir sicher, daß Du die alten kompilierten Klassen nicht noch im Klassenpfad hst ? Dann würde es nämlich noch einen alten Stub irgendwo geben ...
 

Wladimir

Mitglied
Der zuletzt gepostete Fehler liegt daran, dass du versucht auf den Port 0 zu exportieren. Das musst zu zuerst korrigieren.
Java:
UnicastRemoteObject.exportObject(stdmgr, 0);

Zum ursprünglichen Problem:
Könnte ein Konflikt mit bestehenden Stubs/Skeletons sein.

Versuche folgendes und starte server & client mit folgender VM option:
-Djava.rmi.server.ignoreStubClasses=true
Das ignoriert explizit die Stubs.

Falls du zum Testen die Stubs trotzdem bauen willst hier ein Beispiel:
1) cd c:\project\bin (dort wo deine kompilierten .class files liegen)
2) C:\java6\bin\rmic myproject.Server
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben