# Stubs/Skeleton - Erzeugung schlägt stets fehl



## Leonidas82 (28. Dez 2009)

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


----------



## fastjack (29. Dez 2009)

Ab Java 5 brauchst Du das nicht mehr erzeugen, kannst es aber weiterhin noch. Poste doch mal Einzelheiten.


----------



## Leonidas82 (30. Dez 2009)

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 (4. Jan 2010)

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 (4. Jan 2010)

bei mir funzt es so:

```
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


----------



## tfa (5. Jan 2010)

Ein ganz einfaches RMI-Beispiel findest du hier: http://www.java-forum.org/blogs/tfa/12-snippet-rmi-minimal.html


----------



## Leonidas82 (5. Jan 2010)

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:


```
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);
	}
}
```


----------



## Leonidas82 (5. Jan 2010)

tfa hat gesagt.:


> Ein ganz einfaches RMI-Beispiel findest du hier: http://www.java-forum.org/blogs/tfa/12-snippet-rmi-minimal.html



Hallo tfa

meine Implementation sowie der Aufbau meines Programms sollten korrekt sein da dies schon zuvor lief. Allerdings wurden damals die Stubs/Skeletons automatisch via Plugin erzeugt. Nun funzt dies nicht mehr, wenn ich es manuell versuche...


----------



## tfa (6. Jan 2010)

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


----------



## Leonidas82 (6. Jan 2010)

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 (6. Jan 2010)

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 ...


----------



## Leonidas82 (6. Jan 2010)

fastjack hat gesagt.:


> 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 ...



Nein, ich habe das Projekt auf einem anderen Rechner importiert (nur die java-files)


----------



## Wladimir (6. Jan 2010)

Der zuletzt gepostete Fehler liegt daran, dass du versucht auf den Port 0 zu exportieren. Das musst zu zuerst korrigieren.

```
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


----------

