# StubNotFoundException -> ClassNotFoundException Java6



## Patrick_GAST (14. Dez 2007)

Hallo

ich versuche mir gerade RMI näher zu bringen   
Dazu habe ich ein kleines Programm geschrieben.

rmiregistry läuft.

Leider kommt beim starten des Servers immer folgende Exception:


```
java.rmi.StubNotFoundException: Stub class not found: de.logic.server.TransferDataBeanImpl_Stub; nested exception is: 
	java.lang.ClassNotFoundException: de.logic.server.TransferDataBeanImpl_Stub
	at sun.rmi.server.Util.createStub(Unknown Source)
	at sun.rmi.server.Util.createProxy(Unknown Source)
	at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
	at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
	at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
	at de.logic.server.DownloadServer.<init>(DownloadServer.java:24)
	at de.Main.main(Main.java:18)
Caused by: java.lang.ClassNotFoundException: de.logic.server.TransferDataBeanImpl_Stub
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	... 7 more
```

Und nun hier der Code zu diesem Fehler

Ich hab jetzt nicht überprüft ob File Serialisierbar ist aber der Fehler kommt auch wenn es Ausdokumentiert ist

Interface:

```
public interface TransferDataBean extends Remote
{	
	public long getJobID() throws RemoteException;

	public void setJobID(long jobID) throws RemoteException;

	public File getDownloadFile() throws RemoteException;

	public void setDownloadFile(File downloadFile) throws RemoteException;
	
	public int add(int i, int a) throws RemoteException;
}
```


Implementierung

```
public class TransferDataBeanImpl implements TransferDataBean{

	/**
	 * 
	 */
	private long jobID;
	private File downloadFile;
	
	public long getJobID() {
		return jobID;
	}

	public void setJobID(long jobID) {
		this.jobID = jobID;
	}

	public File getDownloadFile() {
		return downloadFile;
	}

	public void setDownloadFile(File downloadFile) {
		this.downloadFile = downloadFile;
	}
	
	public int add(int i, int a) {
		
		return i + a;
	}
}
```

Und das Aufrufende Codeteil


```
TransferDataBeanImpl dataImpl = new TransferDataBeanImpl();
		TransferDataBean dataInterface = (TransferDataBean)UnicastRemoteObject.exportObject(dataImpl);
		
		Registry registry = LocateRegistry.getRegistry();
		registry.rebind("TransferDataBean", dataInterface);
```

In der zweiten Zeilen wird dann die Exception geworfen. Ich habe sogar schonmal probiert die _Stub Klasse selber mit rmic.exe zu kompilieren, obwohl das seit Java 5 ja nicht mehr nötig ist, und habe aber die den gleichen Fehler bzw ähnlichen: ClassNotFound bekommen.

Die codebase muss man ja hier in diesem Fall nicht setzen weil der Server die Klasse kennt oder?

Zur Verdeutlichung:
Der Fehler tritt auf Serverseite auf, ein Client läuft nicht

Muss man vielleicht noch irgendein Flag setzen?

Peace


----------



## kaesebrot (14. Dez 2007)

Hi, 

du mußt beim Starten der rmi-registry noch den classpath mitgeben, damit diese anhand der class-Datei ein stub generieren kann. Habe vor einigen Tagen 4 Stunden danach gesucht  vieleicht ist es das ja


rmiregistry -J-Djava.class.path=/class/path/bin


viele Grüße, 
  Käse


----------



## Patrick_GAST (17. Dez 2007)

Hallo

Vielen Dank erstmal, der Server läuft jetzt.

Auf Clientseite habe ich aber noch ein paar Probleme.

Zuerst hatte ich Probleme mit dem PermissionManager, nachdem ich den aber gesetzt habe und ein policy File angelegt habe kommt diese Exception


```
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: de.logic.server.TransferDataBean
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at download.client.logic.ClientLogic.<init>(ClientLogic.java:39)
        at download.client.Main.main(Main.java:35)
Caused by: java.lang.ClassNotFoundException: de.logic.server.TransferDataBean
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadProxyInterfaces(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
        at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
        at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        ... 3 more
```

Und an dieser Stelle weiß ich nicht mehr weiter.


Meine rmi.policy


```
grant {
	  permission java.security.AllPermission; 
};
```

Und der dazugehörende Aufruf:


```
java -Djava.security.policy=C:/Portale/workspace/ClientGui/rmi.policy C:/Portale/workspace/ClientGui/bin/download/client/Main
```

Hoffentlich weiß jemand Rat

Peace


----------



## Patrick_GAST (17. Dez 2007)

ähh.. 

und hier noch die Clientsource   


```
if (System.getSecurityManager() == null)
			 System.setSecurityManager ( new RMISecurityManager() ); 
		 
		Registry reg = LocateRegistry.getRegistry();
		TransferDataBean dataBean = (TransferDataBean) reg.lookup("DataBean"); 
		
		System.out.println(dataBean.add(5, 4));
```


----------



## kaesebrot (17. Dez 2007)

Hi, 

wenn ich mich nicht irre, hat der Fehler mit dem security-Manager nichts zu tun (Hand, Feuer und reinlegen, ist aber nicht ). Du könntest versuchen den SM erstmal zu deaktivieren. 
Ich denke, es liegt immer noch an der Registry. Versuch mal bei dem Pfad alles nach bin wegzulassen. Das sollte dann eigentlich so gehen... er versucht ja den kompletten Klassennamen aufzulösen. 

Falls alles nichts Hilft, könntest du die Registry zum testen auch erstmal programmiertechnisch laden: 

mit LocateRegistry.createRegistry(Registry.REGIRTRY_PORT), oder so ähnlich.


viel Erfolg


----------



## Patrick_GAST (17. Dez 2007)

Hi

Erstmal danke für deine Hilfe.

Mittlerweile bin ich auf die Idee gekommen mal die codebase zu setzen was ja nicht schaden kann.

Der Aufruf sieht jetzt wie folgt aus:


```
java -Djava.security.policy=C:/Portale/workspace/ClientGui/rmi.policy -Djava.server.rmi.codebase=file:/C:/Portale/workspace/ServerDownloader/bin/ download.client.Main
```

Die Exception ist die selbe geblieben  :cry:


----------



## Patrick_GAST (17. Dez 2007)

Sorry wegen dem häufigen posten, bin im Stress und habe was vergessen

Habe den Code abgeändert und die Registry selber erstellt


Server


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


Client


```
Registry reg = LocateRegistry.getRegistry("localhost", 2099);
```

Hat aber auch nicht weitergeholfen selbe Exception wie zuvor


----------



## kaesebrot (17. Dez 2007)

Hi, 

mir ist gerade was aufgefallen: 

(TransferDataBean)UnicastRemoteObject.exportObject(dataImpl);

sollte 

(TransferDataBean)UnicastRemoteObject.exportObject(dataImpl, 0);

sein  


wenn ich es richtig verstanden habe wird mittels der Angabe von Port 0 signalisiert, daß ein Stub generiert werden soll.


viel Erfolg, 
  Käse


----------



## Patrick_GAST (17. Dez 2007)

ALSO

Vielen Dank für deine Hilfe, ich hab den Fehler ich trau mich aber kaum den hier reinzuschreiben.

Ellbogen -> Genick bitte schnell   :x 

ähm... sagen wir es mal so man sollte schon versuchen das selbe Interface auf Client und Serverseite zu verwenden und nicht nur zwei die gleich heißen...

Bitte jetzt schlagen

Nochmal vielen dank an dich, ich hol mir jetzt nen Stick


----------

