Hallo!
Ich bin mal gespannt, ob mir hier einer helfen kann
Folgendes habe ich vor:
Ich möchte eine Client-Server anwendung schreiben. Die Kommunikation zw. Server und Client erfolgt per rmi. Ferner soll die Funktionalität auf beiden Seiten per Plugins erweiterbar sein. Kommt ein Plugin auf dem Server hinzu, muss der Client natürlich die erweiterten Funktionen auf dem Server nutzen können. Also braucht dieser das entsprechende Gegenstück zum Plugin.
Ziel ist es, dass man einen Server- und Client-Part für ein Plugin schreibt. Der Client-Part kennt natürlich die Funktionen des eigenen Server-Teils und nutzt diese. Ablaufen soll das wie folgt:
Ablegen eines JAR-Files in ein Verzeichnis 'plugins' auf dem Server sowie Client. In diesem JAR-File gibt es zwei vordefinierte Klassen -> ServerPlugin und ClientPlugin. Der Server instantiiert per URLClassLoader das ServerPlugin welches implizit eine von Remote abgeleitete Klasse exportiert (also für rmi).
Etwas ähnliches passiert auf der Client-Seite. Die existierende Klasse ClientPlugin wird vom Client instantiiert welche wiederum implizit über Standard-Funktionen des Clients per rmi auf den Server zugreift und sich eine Referenz auf die von Remote abgeleitete Klasse des Server-Plugins besorgt um diese dann fernzusteuern. Soweit alles klar?
Bis fast zum Schluss funktioniert auch alles. Einaden der Klassen per URLClassLoader funktioniert bestens. Der Server-Part des Plugins wird korrekt exportiert. Doch wenn sich der Client die Referenz auf den Remote-Part des Server-Plugins besorgen will, bekomme ich die folgende Exception:
RMI ist also nicht in der Lage die Klasse 'testplugin.TestPluginImpl_Stub' zu finden. Diese befindet sich aber im JAR-File, welches über einen URLClassLoader eingeladen wurde! Der Server braucht sie doch ebenfalls zum exporteiren und dort hat es funktioniert. Dieselbe Vorgehensweise zum einladen des Clients schlägt aber in diesem Fall auf der Client-Seite fehl. Die Frage ist nun, warum RMI nicht auf die in meinem JAR-File befindlichen Files zugreifen kann? RMI scheint den Weg aus dem SystemClassLoader zu meinem URLClassLoader nicht zu finden.
Den URLClassLoader benutze ich so:
Ich bin verzweifelt am Suchen einer Lösung für dieses Problem. Wäre echt klasse, wenn mir da jemand von euch einen Tipp geben könnte, woran es liegt.
Wenn jemand Probleme hat zu verstehen was genau mein Programm tut, bin ich gerne bereit es etwas ausführlicher zu formulieren oder Code bereit zu stellen.
Grüsse,
Martin
Ich bin mal gespannt, ob mir hier einer helfen kann
Folgendes habe ich vor:
Ich möchte eine Client-Server anwendung schreiben. Die Kommunikation zw. Server und Client erfolgt per rmi. Ferner soll die Funktionalität auf beiden Seiten per Plugins erweiterbar sein. Kommt ein Plugin auf dem Server hinzu, muss der Client natürlich die erweiterten Funktionen auf dem Server nutzen können. Also braucht dieser das entsprechende Gegenstück zum Plugin.
Ziel ist es, dass man einen Server- und Client-Part für ein Plugin schreibt. Der Client-Part kennt natürlich die Funktionen des eigenen Server-Teils und nutzt diese. Ablaufen soll das wie folgt:
Ablegen eines JAR-Files in ein Verzeichnis 'plugins' auf dem Server sowie Client. In diesem JAR-File gibt es zwei vordefinierte Klassen -> ServerPlugin und ClientPlugin. Der Server instantiiert per URLClassLoader das ServerPlugin welches implizit eine von Remote abgeleitete Klasse exportiert (also für rmi).
Etwas ähnliches passiert auf der Client-Seite. Die existierende Klasse ClientPlugin wird vom Client instantiiert welche wiederum implizit über Standard-Funktionen des Clients per rmi auf den Server zugreift und sich eine Referenz auf die von Remote abgeleitete Klasse des Server-Plugins besorgt um diese dann fernzusteuern. Soweit alles klar?
Bis fast zum Schluss funktioniert auch alles. Einaden der Klassen per URLClassLoader funktioniert bestens. Der Server-Part des Plugins wird korrekt exportiert. Doch wenn sich der Client die Referenz auf den Remote-Part des Server-Plugins besorgen will, bekomme ich die folgende Exception:
Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: testplugin.TestPluginImpl_Stub (no security manager: RMI class loader disabled)
Den URLClassLoader benutze ich so:
Code:
File jarFile = new File("/path/to/TestPlugin.jar");
URLClassLoader classLoader = new URLClassLoader(new URL[] {jarFile.toURL()}, getClass().getClassLoader());
Class classDef = classLoader.loadClass(className);
GenericPlugin plugin = (GenericPlugin)classDef.newInstance();
Ich bin verzweifelt am Suchen einer Lösung für dieses Problem. Wäre echt klasse, wenn mir da jemand von euch einen Tipp geben könnte, woran es liegt.
Wenn jemand Probleme hat zu verstehen was genau mein Programm tut, bin ich gerne bereit es etwas ausführlicher zu formulieren oder Code bereit zu stellen.
Grüsse,
Martin