StubNotFoundException -> ClassNotFoundException Java6

Status
Nicht offen für weitere Antworten.
P

Patrick_GAST

Gast
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:

Code:
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:
Code:
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
Code:
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

Code:
		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

Mitglied
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
 
P

Patrick_GAST

Gast
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

Code:
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

Code:
grant {
	  permission java.security.AllPermission; 
};

Und der dazugehörende Aufruf:

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

Hoffentlich weiß jemand Rat

Peace
 
P

Patrick_GAST

Gast
ähh..

und hier noch die Clientsource :D

Code:
		 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

Mitglied
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
 
P

Patrick_GAST

Gast
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:

Code:
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:
 
P

Patrick_GAST

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

Habe den Code abgeändert und die Registry selber erstellt


Server

Code:
Registry registry = LocateRegistry.createRegistry(2099);


Client

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

Hat aber auch nicht weitergeholfen selbe Exception wie zuvor
 

kaesebrot

Mitglied
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
 
P

Patrick_GAST

Gast
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 :D
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben