# RMI als Eclipse Plug-In



## d-n-r (30. März 2007)

Hallo Leute,

es ist mir bewusst, dass es über das Thema schon einige Beiträge gibt, trotzdessen war es mir leider nicht möglich mein Plug-In zum Laufen zu bewegen. Ich hoffe jemand kann mir einen Tipp geben.

Ich möchte einen RMI Server starten und das ganze als Eclipse Plug-In. Hier ist der (völlig abgespeckte) Code des Servers:


```
public class TestServerImpl extends UnicastRemoteObject implements TestServer {

	private static final long serialVersionUID = -4030374539549388613L;

	private TestServerImpl() throws RemoteException {
		super();
	}

	public static void startTestServer() {
		try {
			LocateRegistry.createRegistry(1234);
		} catch (RemoteException e2) {
			e2.printStackTrace();
		} 
		
		String serverName = null;
		try {
			serverName = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":1234/TestServer";
		} catch (UnknownHostException e1) {
			e1.printStackTrace();
		} 

		TestServerImpl server = null;
		try {
			server = new TestServerImpl();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			Naming.rebind(serverName, server);
			System.out.println (serverName + " bound to rmi registry, at port " + "1234" + "."); 
		} catch (RemoteException e) {
			System.out.println ("Rebinding " + serverName + " failed.");
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}


	public void test() throws RemoteException {
	}
```

Das gibt mir die 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: servertest.TestServer (no security manager: RMI class loader disabled)
...
```

Ok. Kein SecurityManager. Also habe ich den SecurityManager hinzugefügt. Hier nochmal der Code:


```
public class TestServerImpl extends UnicastRemoteObject implements TestServer {


	private static final long serialVersionUID = -4030374539549388613L;

	private TestServerImpl() throws RemoteException {
		super();
	}

	public static void startTestServer() {
		System.setProperty("java.security.policy", "d:/rmi.policy");
		System.setProperty("java.rmi.server.ignoreStubClasses","true");
		if(System.getSecurityManager() == null) {
			System.setSecurityManager(new RMISecurityManager());
		}
		
		try {
			LocateRegistry.createRegistry(1234);
		} catch (RemoteException e2) {
			e2.printStackTrace();
		} 
		
		String serverName = null;
		try {
			serverName = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":1234/TestServer";
		} catch (UnknownHostException e1) {
			e1.printStackTrace();
		} 

		TestServerImpl server = null;
		try {
			server = new TestServerImpl();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			Naming.rebind(serverName, server);
			System.out.println (serverName + " bound to rmi registry, at port " + "1234" + "."); 
		} catch (RemoteException e) {
			System.out.println ("Rebinding " + serverName + " failed.");
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}


	public void test() throws RemoteException {
	}
}
```

Damit gibt es 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: servertest.TestServer
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
	at sun.rmi.transport.Transport$1.run(Transport.java:153)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
	at java.lang.Thread.run(Thread.java:595)
	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.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Naming.java:160)
	at servertest.TestServerImpl.startTestServer(TestServerImpl.java:59)
	at servertest.TestView$1.run(TestView.java:108)
	at org.eclipse.jface.action.Action.runWithEvent(Action.java:499)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
	at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:441)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
	at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
	at org.eclipse.core.launcher.Main.run(Main.java:977)
	at org.eclipse.core.launcher.Main.main(Main.java:952)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: servertest.TestServer
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
	at sun.rmi.transport.Transport$1.run(Transport.java:153)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
	at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: servertest.TestServer
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:242)
	at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:707)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:651)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:588)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
	at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
	at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1500)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1463)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
	... 9 more
```

Das Policy-File liegt natürlich in d:\rmi.policy und gibt alle Permissions.

Ich hoffe jemand hat vielleicht einen guten Hinweis für mich.
Vielen Dank schonmal.

Edit: java5, Eclipse 3.2

Gruß,
Dominik


----------



## Zilchinger (2. April 2007)

Hallo d-n-r .
Sieht so aus, als würden da die Stubs und Skeletons nicht richtig erzeugt werden!
Hast Du denn schonmal ausprobiert, ob das ganze normal lauffähig ist? Sprich nicht gleich als Eclipse Plugin?

Wir können ja morgen nochmal zusammen drüber schauen, hehe

Bis denne,
Zilchinger


----------



## Thomas Darimont (2. April 2007)

Hallo,

ich glaube das du zum einen den Classpath der RMI Registry nicht richtig gesetzt hast und zum anderen die Stubs nicht richtig genriert hast oder das du die RMI Runtime nicht so konfiguriert hast das diese die Stubs selber generieren soll (Das geht übrigens seit Java 5).



> Sieht so aus, als würden da die Stubs und Skeletons nicht richtig erzeugt werden!


Also Skeletons braucht man schon seit Java 1.3 nicht mehr und die Stubs sind seit Java 5 auch optional.

schau mal hier:
http://www.tutorials.de/forum/java/231847-rmi-unter-java-5-a.html

Gruß Tom


----------



## Thomas Darimont (2. April 2007)

Hallo,

bei mir funktioniert folgendes ohne Probleme:
3 Plugins:
de.tutorials.eclipse.services (Services)
de.tutorials.eclipse.server (Server)
de.tutorials.eclipse.client (Client)

Das Services Plugin enthält die Service Interfaces. Das Server sowie das Client Plugin sind von dem
Services Plugin abhängig. Das Services Plugin exportiert die Service-Interfaces.

Unser ITimeService Interface im Services Plugin:

```
/**
 * 
 */
package de.tutorials.eclipse.services.timeservice;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;

/**
 * @author Thomas.Darimont
 *
 */
public interface ITimeService extends Remote {
    Date getSystemTime() throws RemoteException;
}
```

Unser Server Plugin: RMI Registry hoch ziehen / Service Implementierung registrieren:

unsere Service Implementierung:

```
/**
 * 
 */
package de.tutorials.eclipse.server.services.timeservice.internal;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;

import de.tutorials.eclipse.services.timeservice.ITimeService;

/**
 * @author Thomas.Darimont
 * 
 */
public class TimeServiceImpl extends UnicastRemoteObject implements
        ITimeService {

    public TimeServiceImpl() throws RemoteException {
        super();
        System.out.println("TimeService created");
    }

    public Date getSystemTime() {
        return new Date();
    }
}
```

Der Activator des Servers:

```
package de.tutorials.eclipse.server;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteStub;
import java.rmi.server.UnicastRemoteObject;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import de.tutorials.eclipse.server.services.timeservice.internal.TimeServiceImpl;
import de.tutorials.eclipse.services.timeservice.ITimeService;


public class Activator implements BundleActivator {

    private Registry registry;
    
    private int port = 1099;
    
    public void start(BundleContext context) throws Exception {
        this.registry = LocateRegistry.createRegistry(this.port);
        this.registry.rebind(ITimeService.class.getName(), new TimeServiceImpl());
        System.out.println("Started RMI Registry on Port: " + port);
    }

    public void stop(BundleContext context) throws Exception {
        System.out.println("Shutting down RMI Registry");
    }
}
```

Der Client Activator:

```
package de.tutorials.eclipse.client;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.concurrent.TimeUnit;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import de.tutorials.eclipse.services.timeservice.ITimeService;

public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        Registry registry = LocateRegistry.getRegistry();
        ITimeService timeService = (ITimeService)registry.lookup(ITimeService.class.getName());
        System.out.println("Client: " + timeService.getSystemTime());
    }
    
    public void stop(BundleContext context) throws Exception {
        //noop
    }
}
```

Startet man nun Server und Services Plugins mit dem Equinox Framework Launcher, so bekommt man folgende Ausgabe:
[Server]

```
TimeService created
Started RMI Registry on Port: 1099
```

Anschließend startet man das Client plugin mit einem separaten Equinox Launcher. Hier sieht man dann eine ähnliche Ausgabe:
[Client]

```
Client: Mon Apr 02 19:06:38 CEST 2007
```

Nur nebenbei Angemerkt... mit dem Springframework (http://www.springframework.org/) kann man einen Service wunderbar einfach per RMI Expotieren: http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html#remoting-rmi
Das schöne dabei ist dann u.a, dass man seine Service-interfaces nicht von java.rmi.Remote ableiten muss, dass die Service Methoden keine RemoteException deklarieren müssen, das man den Serviice nicht von Hand über ein UnicastRemoteObject exportieren muss.

Gruß Tom


----------



## d-n-r (2. April 2007)

Hallo Thomas,

also mal vielen Dank für die Vorschläge und Deine Mühe.

Ich habe Deine Plugins gerade ausprobiert und sie laufen bei mir auch mit dem Equinox Launcher. Allerdings habe ich leider keine Erfahrung mit reinen Equinox Anwendungen und kann daher die Unterschiede zu Eclipse-Plugins nicht richtig überschauen. Wenn ich das beim Drüberlesen richtig verstanden habe, ist Equinox ja die Platform plus das OSGI Framework

Wie dem auch sei, nach einiger Arbeit haben wir (Zilchinger und ich) das Ding doch noch zum Laufen bekommen und hier ist meine Lösung für alle die das gleiche Problem haben:

Das Problem ist in der Tat, das der Plugin-Classloader die Interfaces nicht finden kann. Lösen lässt sich das Problem durch Setzen des 
	
	
	



```
java.rmi.server.codebase
```
 Property, gerne auch programmatisch:


```
System.setProperty("java.rmi.server.codebase", path);
```

Tricky an der ganzen Sache ist, dass Leerzeichen nicht erlaubt sind. Andererseits haut eine URL-Codierung mit 
	
	
	



```
URLEncoder.encode
```
 auch nicht hin. Ersetzt man allerdings alle " " mit %20 findet der Classloader auf wundersame Weise alle Interfaces und der Server fährt hoch.

Um das Verzeichnis des Plugins rauszufinden bin ich über 
	
	
	



```
Activator.getDefault().getBundle()
```
und

```
URL url = FileLocator.find(bundle, new Path("/bin/"), null);
```
gegangen. Damit bekommt man den Pfad, den man dann mit dem codebase Property setzen kann.

Vielen Dank auch für den Hinweis auf das Spring Framework. Ich werde es mit in der Tat demnächst mal anschauen, doch da ich etwas unter Zeitdruck stehe, begnüge ich mich für den Moment mit der funktionierenden RMI Variante.

Vielen Dank nochmal,
Gruß,
Dominik


----------



## Thomas Darimont (2. April 2007)

Hallo,

hier mal noch eine alternative Implementierung, bei der unser Service nicht von UnicastRemoteObject abgeleitet sein muss:

Unsere neue Service Implementierung / Interface wie oben:

```
/**
 * 
 */
package de.tutorials.eclipse.server.services.timeservice.internal;

import java.util.Date;

import de.tutorials.eclipse.services.timeservice.ITimeService;

/**
 * @author Thomas.Darimont
 */
public class TimeServiceImpl implements ITimeService {

  public TimeServiceImpl() {
    System.out.println("TimeService created");
  }


  public Date getSystemTime() {
    return new Date();
  }
}
```

Unser Server Activator:

```
package de.tutorials.eclipse.server;

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

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import de.tutorials.eclipse.server.services.timeservice.internal.TimeServiceImpl;
import de.tutorials.eclipse.services.timeservice.ITimeService;

public class Activator implements BundleActivator {

  private Registry registry;

  private int port = 10099;


  public void start(BundleContext context) throws Exception {
    System.setProperty("java.rmi.server.ignoreStubClasses", "true");
    this.registry = LocateRegistry.createRegistry(this.port);
    try {
      this.registry.rebind(ITimeService.class.getName(), UnicastRemoteObject.exportObject(new TimeServiceImpl(),
        9999));
    } catch (Throwable throwable) {
      throwable.printStackTrace();
    }
    System.out.println("Started RMI Registry on Port: " + port);
  }


  public void stop(BundleContext context) throws Exception {
    System.out.println("Shutting down RMI Registry");
  }
}
```

Unser Client Activator:

```
package de.tutorials.eclipse.client;

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

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import de.tutorials.eclipse.services.timeservice.ITimeService;

public class Activator implements BundleActivator {

  public void start(BundleContext context) throws Exception {
    System.setProperty("java.rmi.server.ignoreStubClasses", "true");
    Registry registry = LocateRegistry.getRegistry("srv01", 10099);
    ITimeService timeService;
    try {
      timeService = (ITimeService) registry.lookup(ITimeService.class.getName());
      System.out.println("Client: " + timeService.getSystemTime());
    } catch (Throwable t) {
      t.printStackTrace();
    }
  }


  public void stop(BundleContext context) throws Exception {
    // noop
  }
}
```

Auch hier werden die beiden Plugins über separate Equinox-Launcher gestartet...
Über das JVM System Property java.rmi.server.ignoreStubClasses Teilen wir der RMI Runtime mit, dass anstatt etwaig vorhandener Stubs  Dynamic Proxies verwendet werden sollen.

Gruß Tom


----------



## alexb-ose (16. Juni 2008)

Thomas Darimont hat gesagt.:


> Nur nebenbei Angemerkt... mit dem Springframework (http://www.springframework.org/) kann man einen Service wunderbar einfach per RMI Expotieren: http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html#remoting-rmi
> Das schöne dabei ist dann u.a, dass man seine Service-interfaces nicht von java.rmi.Remote ableiten muss, dass die Service Methoden keine RemoteException deklarieren müssen, das man den Serviice nicht von Hand über ein UnicastRemoteObject exportieren muss.




Hallo, Thomas.
Habe den Thread entdeckt, weil ich auch Probleme mit RMI in der OSG-Umgebung habe.
Dein Beispiel funktioniert einwandfrei. Aber ich ging einen Schritt weiter und versuchte das Remoting über Springframework zu realisieren.
Dafür habe ich die Spring-Bundles eingestzt:
http://www.springsource.com/reposit...&searchType=bundlesByName&searchQuery=context

Es ist mir gelungen (mit ClassLoader-Krücken) den Service auf der Server-Seite einzubinden (org.springframework.remoting.rmi.RmiServiceExporter) und auf der Client-Seite zu connecten (org.springframework.remoting.rmi.RmiProxyFactoryBean).
Bei Aufrufen ohne Parameter gibt es auch keine Probleme. Nur wenn man eine Funktion mit Parameter auf der Client-Seite aufruft, wird die Parameter-Klasse auf der Server-Seite nicht gefunden:


osgi> TimeService created
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
	at sun.rmi.transport.Transport$1.run(Transport.java:159)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at org.springframework.remoting.rmi.RmiServiceExporter.prepare(RmiServiceExporter.java:286)
	at org.springframework.remoting.rmi.RmiServiceExporter.afterPropertiesSet(RmiServiceExporter.java:227)
	at de.tutorials.eclipse.server.Activator.start(Activator.java:57)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
	at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
	at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
	at sun.rmi.transport.Transport$1.run(Transport.java:159)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
	at java.ibjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
	at java.ibjectInputStream.readClassDesc(ObjectInputStream.java:1496)
	at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
	at java.ibjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.ibjectInputStream.readObject(ObjectInputStream.java:351)
	... 12 more
org.springframework.remoting.RemoteLookupFailureException: Could not find RMI service [rmi://localhost:2445/ITimeService2] in RMI registry; nested exception is java.rmi.NotBoundException: ITimeService2
	at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:210)
	at org.springframework.remoting.rmi.RmiClientInterceptor.prepare(RmiClientInterceptor.java:146)
	at org.springframework.remoting.rmi.RmiClientInterceptor.afterPropertiesSet(RmiClientInterceptor.java:134)
	at org.springframework.remoting.rmi.RmiProxyFactoryBean.afterPropertiesSet(RmiProxyFactoryBean.java:67)
	at de.tutorials.eclipse.client.Activator.start(Activator.java:34)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
	at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
	at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
Caused by: java.rmi.NotBoundException: ITimeService2
	at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
	at sun.rmi.transport.Transport$1.run(Transport.java:159)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Naming.java:84)
	at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:199)
	... 17 more

Wäre Dir dankbar, wenn du etwas Licht in das Thema reinbringen würdest.

Gruss, Alex


----------



## Thomas Darimont (16. Juni 2008)

Hallo,

wenn du Spring in einer OSGi basierten Anwendung verwenden willst solltest du dir Spring Dynamic Modules anschauen:
http://springframework.org/osgi
http://springframework.org/download
Spring Dynamic Modules *1.0.2* is the current stable release

schau mal hier:
http://www.tutorials.de/forum/java/303535-spring-dynamic-modules-osgi-und-aspectj.html

Gruß Tom


----------



## alexb-ose (23. Juni 2008)

Thomas Darimont hat gesagt.:


> Hallo,
> 
> wenn du Spring in einer OSGi basierten Anwendung verwenden willst solltest du dir Spring Dynamic Modules anschauen:
> http://springframework.org/osgi
> ...



Hallo, Tom.
Bin heute endlich dazu gekommen meine OSGI-RMI-Tests fortzusetzen.
Der Einsatz von Spring-DM hat mich aber nicht wirklich weiter gebracht.
Also, alles nacheinandern 
.
Habe Deinen TimeSrvice-Server so angepasst, dass er mit Spring-DM aktiviert wird. Dazu den Activator rausgenommen und die Spring-Conf-Dateien unter META-INF/spring eingestellt. Der Start des OSGI-Frameworks erfolgt ohne Probleme:

```
Framework is launched.

id	State       Bundle
0	ACTIVE      system.bundle_3.2.2.R32x_v20070118
1	ACTIVE      org.springframework.osgi.aopalliance.osgi_1.0.0.SNAPSHOT
2	ACTIVE      de.tutorials.eclipse.server_1.0.0
3	ACTIVE      org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
	            Fragments=17
4	ACTIVE      org.springframework.bundle.spring.context.support_2.5.4
5	ACTIVE      org.springframework.bundle.spring.core_2.5.4
6	ACTIVE      org.springframework.bundle.osgi.core_1.1.0.m2
7	ACTIVE      jcl104.over.slf4j_1.4.3
8	ACTIVE      org.springframework.bundle.spring.beans_2.5.4
9	ACTIVE      org.springframework.bundle.spring.aop_2.5.4
10	ACTIVE      slf4j.log4j12_1.4.3
11	ACTIVE      org.springframework.osgi.cglib-nodep.osgi_2.1.3.SNAPSHOT
12	ACTIVE      org.springframework.bundle.spring.context_2.5.4
13	ACTIVE      org.springframework.bundle.osgi.extender_1.1.0.m2
14	ACTIVE      de.tutorials.eclipse.services_1.0.0
15	ACTIVE      org.springframework.bundle.osgi.io_1.1.0.m2
16	ACTIVE      slf4j.api_1.4.3
17	RESOLVED    log4j_config_1.0.0
	            Master=3
```

Der Time-Service wird im OSGI registriert und als RMI-Service exportiert.

Den OSGI-Client habe ich nicht gestartet. Dafür habe ich eine einfache Main-Klasse im Service-Projekt für den RMI-Test eingesetzt.

Das Ergebnis unterscheidet sich nicht von dem ohne Spring-DM: Die Parameter-Klasse wird im Server nicht gefunden.
Hätte mich auch gewundert, wenn es anders wäre. Ich meine, wenn ich mit einem Schaltgetriebe nicht durchkomme, komme ich mit einer Automatik erst recht nicht durch

Gruß Alex


----------

