ClassNotFoundException bei RMI

2AndAHalfBit

Aktives Mitglied
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:
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloWorldRMI extends Remote {

	void printHelloWorld() throws RemoteException;
}

Die Server-Komponente

Java:
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:
java.lang.ClassNotFoundException: HelloWorldRMIImpl_Stub
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:413
)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)



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

Grüße
 
Zuletzt bearbeitet:

Kr0e

Gesperrter Benutzer
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 :p

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

Kr0e

Gesperrter Benutzer
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

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

r.w.

Bekanntes Mitglied
Die Server-Komponente

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




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

Grüße

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

Wolli

Mitglied
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":
Java:
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:

Java:
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:
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 ...
 

Ähnliche Java Themen


Oben