# ClassNotFoundException bei RMI



## 2AndAHalfBit (20. Sep 2011)

Guten Abend, 

ich benötige mal wieder eure Hilfe. 
Ich habe mich mit RMI beschäftigt und komme nicht weiter. Es geht um ein simples Programm, das ich testweise über localhost laufen lasse. Es handelt sich lediglich um ein HelloWorld. Das Problem ist, dass beim registrieren meines Remote-Objekts eine ClassNotFoundException geworfen wird. Er sagt mir, dass er den Stub nicht finden kann. 

Randbedingungen:

- ich habe kein Eclipse verwendet, sondern einen nativen Texteditor
- alle Dateien (sowohl die Sourcecodes als auch die compilierten Class-Dateien befinden sich im selben Verzeichnis)
- den Stub habe ich über dem RMI-Compiler erzeugt (rmic)

Hier der Code

Das Interface:

```
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloWorldRMI extends Remote {

	void printHelloWorld() throws RemoteException;
}
```

Die Server-Komponente


```
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloWorldRMIImpl extends UnicastRemoteObject implements HelloWorldRMI {

	public HelloWorldRMIImpl() throws RemoteException {}
	
	public void printHelloWorld(){
		
		System.out.println("Hello World");
	}
	
	public static void main(String args[])
	{
		try
		{
			HelloWorldRMIImpl remoteObject = new HelloWorldRMIImpl();
			java.rmi.Naming.bind("//localhost/HelloWorld", remoteObject);
			System.out.println("Server-Objekt erzeugt, erwarte Aufrufe.");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}
```

//edit: achso die Exception könnt hilfreich sein


> java.rmi.ServerException: RemoteException occurred in server thread; nested exce
> ption is:
> java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
> tion is:
> ...





Die Client-Komponente ist egal, da der Fehler beim Starten des Servers schon auftritt. Kann mir jemand hier weiterhelfen?

Grüße


----------



## Kr0e (21. Sep 2011)

Du brauchst keine Stubs mehr, dass ist Schnee von gestern. Java macht das heute mit Dynamic Proxy Classes vollkommen automatisch!

Woher nun aber die Exception stammt kann ihc nicht sagen. Mit Java RMI hab ich eigentlihc null Erfahrung. Ich hab mir was eigenes gebastelt 

Aber ausm Bauch heraus würde ich sagen, du brauchst ne Registry um iwas zu binden ,)


----------



## 2AndAHalfBit (21. Sep 2011)

Hallo, 

habe ich vergessen zu erwähnen. Die Registry ist das Dienstprogramm rmiregistry.
Das habe ich gestartet.

Grüße


----------



## Kr0e (21. Sep 2011)

Ok also, die Expcetion sagt eigentlcih alles was man wissen muss. Nachdem ich sie mir nochmal angeschaut hab, glaub ich es verstanden zu haben:

UnmarshallException bedeutet dass der Server nicht in der Lage ist, das Objekt das du gerade binden willst, zu deserialisieren undzwar weil: ClassNotFound.

Das heißt, dass dem Server die Klasse HelloWorldRMIImpl_Stub nicht bekannst ist. Versuchs doch mal ohne Stub (Wie auch es mit Stub geht.. Ich hatte noch nie Stub erstellt, ich habe mit Java nach Java5 angefangen uind wie gesagt auch nur wenig Erfahrung mit JavaRMI).

Deine Klasse heißt ja eigentlich HelloWorldRMIImpl also dürfte es auch schwer werden die HelloWorldRMIImpl_Stub klasse zu finden...


----------



## 2AndAHalfBit (21. Sep 2011)

2AndAHalfBit hat gesagt.:


> Guten Abend,
> Das Problem ist, dass beim registrieren meines Remote-Objekts eine ClassNotFoundException geworfen wird. Er sagt mir, dass er den Stub nicht finden kann.



Wie gesagt, mir ist schon klar, was nicht funktioniert. Er findet meinen Stub nicht. Der Stub wurde mit rmic generiert. Das ist auch gar nicht die Frage (das sehe ich selber).

Die Frage ist vielmehr, warum er die Klasse nicht finden kann.
Wie gesagt, sie existiert und liegt im gleichen Verzeichnis wie der Server und Client.
Grüße


----------



## Kr0e (21. Sep 2011)

Udn meine Frage: Warum benutzt du Stubs noch immer ? Musst du <=Java1.4 benutzen ?


----------



## 2AndAHalfBit (21. Sep 2011)

Hallo Kr0e, 

es ist eine Aufgabe fürs Studium.
Grüße


----------



## Kr0e (21. Sep 2011)

Hm merkwürdig das eine Uni voraussetzt etwas zu lernen was nicht mehr verwendet wird. Da würde ich bei meinem Prof streiken.

Vlt hilft ja das:

Distributed Systems - Java RMI Tutorial

Dort ist nochmal das Verfahren für die Stub Erstellung beschrieben. Is vlt nur ein kleiner formaler Fehler...


----------



## r.w. (23. Sep 2011)

2AndAHalfBit hat gesagt.:


> Die Server-Komponente
> 
> 
> ```
> ...



Hab schon länger nichts mehr mit RMI gemacht, aber fehlt da nicht 
ein Aufruf in der Art von LocateRegistry.getRegistry(port)?


----------



## Peter W. Marth (23. Sep 2011)

Hallo,

man muss der rmiregistry beim Starten mitteilen, wo sie die betreffenden Stubs finden kann, z.B.

rmiregistry.exe -J-Djava.rmi.server.codebase="file://C:/temp/meinestubs.jar"

Siehe auch Dynamic code downloading using RMI


----------



## Kr0e (23. Sep 2011)

Mensch, wie umständlich das vor Java5 war...


----------



## Wolli (20. Nov 2011)

hey leute ... ich wollt kein neuen thread aufmachen weil eigentlich hab ich genau das gleiche problem wie der opener nur dass ich jdk 7 benutze ... kein stubs und nix und trotzdem ClassNotFoundException

rmiregistry is gestartet ...

wenn man einen securitymanager einbaut kommt die fehlermeldung nicht mehr aber eine accesnotallowedexception ...

hier mal die codes (bereinigt von den methoden die der server dann mal später machen soll ...)
das is der "Server":

```
package view;

import interfaces.OrderManager;

public class OrderManagerImpl extends UnicastRemoteObject implements OrderManager {
	
	private static final long serialVersionUID = 1L;

	public OrderManagerImpl() throws RemoteException {
		super();
	}

	public static void main(String[] args) {
		try {
			Naming.rebind("OrderManager", new OrderManagerImpl());
			System.out.println("Server gestartet!!!");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
```

das ist des Servers Interface:


```
package interfaces;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface OrderManager extends Remote, Serializable  {

}
```

und hier die fehlermeldung:

```
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: interfaces.OrderManager
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Naming.java:177)
	at view.OrderManagerImpl.main(OrderManagerImpl.java:74)
```

hoffe jemand weiß eine idee ... ausführen tu ich alles in eclipse indigo ...


----------



## Wolli (21. Nov 2011)

niemand ne idee??? schade ...


----------



## r.w. (21. Nov 2011)

Wolli hat gesagt.:


> niemand ne idee??? schade ...



Ist schon etwas her, weshalb ich nicht ganz sicher bin.
Aber ich meine, dass der Fehler auftritt, wenn das Interface und die Implementation nicht im gleichen Package liegen.

VG ROlf


----------

