# RMI - eigene Registry (no security manager: RMI class loader disabled)



## Saxony (14. Sep 2009)

Hiho,

ich arbeite zur Zeit mit Java RMI.

Ich möchte die Erstellung der Registry direkt von meinem Server erledigen lassen und nicht rmiregistry.exe des JDK verwenden.

Mein Server macht dies im Moment so:

```
LocateRegistry.createRegistry(9006);

Registry registry = LocateRegistry.getRegistry(9006);
registry.rebind("MyService", new MyServiceImpl());
```

Dies soll mir lokal eine Registry mit Port 9006 anlegen. Da MyServiceImpl bereits von UnicastRemoteObject erbt spart man sich ja das UnicastRemoteObject.exportObject(obj, port).

Naja so weit so gut - starte ich nun den Server, erhalte ich folgende Exception:


```
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: myproject.rmi.server.IMyService (no security manager: RMI class loader disabled)
```

IMyService ist ein Interface, welches von Remote erbt und die zu verwendenden Methoden enthält.
IMyService wird von MyServiceImpl implementiert.


```
public class MyServiceImpl extends UnicastRemoteObject implements IMyService
```

Wie erzeuge ich nun meine eigene Registry auf einem bliebigen Port ohne Verwendung von rmiregistry.exe?

bye Saxony


----------



## tuxedo (14. Sep 2009)

Puuh. Sieht soweit alles korrekt aus. Hast du mal probiert obs mit dem Standardport 1099 besser funktioniert?

- Alex


----------



## Saxony (15. Sep 2009)

Hiho,

also wenn ich es genau so wie oben mit 1099 versuche, erhalte ich die selbe Exception.

Verwende ich rmiregistry:


```
start rmiregistry -J-Djava.class.path=D:\MyProject\bin -J-Djava.rmi.server.hostname=192.168.4.75
```

Und im Server:


```
Naming.rebind("MyService", new MyServiceImpl());
```

dann klappt alles.

Kann es sein, dass bei Erzeugung einer eigenen Registry vorher einen SecurityManager setzen muss? Es gibt doch da, RMISecurityManager. Aber eigentlich wollte ich ja die Angabe von codebase, classpath oder download von remote locations vermeiden indem ich die Registry eben per Hand erzeuge, da müsste er ja zumindest für den Server alles im eigentlichen Application ClassPath finden.

bye Saxony


----------



## tuxedo (15. Sep 2009)

Als ich noch RMI benutzt hab, hab ich glaub ich nie einen SecurityManager gesetzt. Ging AFAIR immer auch so.


----------



## Saxony (15. Sep 2009)

Hiho,

also wenn man nach der Exception googlet, kommt immer mit einem


```
System.setSecurityManager(new RMISecurityManager());
```

soll es klappen!

Tja - leider hat meine Eclipse RCP Anwendung keine Rechte mehr Ihren Classloader zu verwenden bzw. in das logfile zu schreiben.

Aber wo man auch schaut soll es so - teilweise auch ohne RMISecurityManager - funktionieren.

Teilweise sind die Beschreibungen hierzu auch noch aus einer Zeit vor JDK 1.5... ka vielleicht hat sich da ja was geändert.

bye Saxony


----------



## Saxony (15. Sep 2009)

Hiho,

nunja was soll ich sagen:

klappt nicht:

```
LocateRegistry.createRegistry(9006);
 
Registry registry = LocateRegistry.getRegistry(9006);
registry.rebind("MyService", new MyServiceImpl());
```

so klappt es: !?!

```
Registry registry = LocateRegistry.createRegistry(9006);

registry.rebind("MyService", new MyServiceImpl());
```

bye Saxony


----------



## tuxedo (15. Sep 2009)

Das ist ja "strange"....???:L
Wieder was dazu gelernt ...

Aber gut, hauptsache es funzt jetzt 

- Alex


----------

