Probleme mit URLClassLoader in Verbindung mit rmi

Status
Nicht offen für weitere Antworten.

mfernau

Bekanntes Mitglied
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:
Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: testplugin.TestPluginImpl_Stub (no security manager: RMI class loader disabled)
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:
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
 

Bleiglanz

Gesperrter Benutzer
"no security manager: RMI class loader disabled"

schon mal gegoogelt? Du brauchst einen SecurityManager (und eine Policy)

könnte auch sein, dass das so gar nicht geht (nur mal angedacht, bin mir da nicht sicher)

a) der Server schickt eine Instanz vom Stub übers Netz, die mit dem nötigen Zugriffsschamott ausgerüstet ist

b) der Client kann das Ding nur aktzeptieren, wenn er die Stub_Klasse kennt, aber die ist bei dir NICHT die gleiche wie die vom Server, weil sie von einem anderen Classloader geladen werden soll/worden ist???

Würde eher versuchen

- mit RMI-Codebase zu arbeiten und die Plugins alle am Server lassen

- oder auf die Java5 "stubless" RMI-Clients zu setzen (Stub wird automatisch als Dynamic Proxy erzeugt)
 

mfernau

Bekanntes Mitglied
Bleiglanz hat gesagt.:
"no security manager: RMI class loader disabled"

schon mal gegoogelt? Du brauchst einen SecurityManager (und eine Policy)
Und wie ich gegoogelt hab :) Ich hab auch schon mal mit dem RMISecurityManager gearbeitet und einfach alles zu erlauben (per policy) -> kein Erfolg

Bleiglanz hat gesagt.:
a) der Server schickt eine Instanz vom Stub übers Netz, die mit dem nötigen Zugriffsschamott ausgerüstet ist

b) der Client kann das Ding nur aktzeptieren, wenn er die Stub_Klasse kennt, aber die ist bei dir NICHT die gleiche wie die vom Server, weil sie von einem anderen Classloader geladen werden soll/worden ist???
Genau; Der Punkt b) leuchtet mir ein und den hab ich mir auch schon gedacht. Aber das muss doch machbar sein? Die Frage ist, mit welchem ClassLoader wird der Kram denn auf der Server-Seite eingeladen? Mit dem URLClassLoader oder mit dem SystemClassLoader? Entsprechendes 'müsste' doch Client-Seitig ebenfalls gehen? Auf der Server-Seite hat er ja nicht geklagt über dieses Vorgehen... Dort hat der den Stub doch auch benötigt und eingeladen!?

Bleiglanz hat gesagt.:
Würde eher versuchen

- mit RMI-Codebase zu arbeiten und die Plugins alle am Server lassen
Halte ich für keine gute Idee. Oder ich wüsste gerade nicht wie das funktionieren sollte. Klar ist schon mal, dass eine gewisse Grundfunktionalität clientseitig hinzugefügt werden MUSS. Sonst weiss ich ja gar nichts über die erweiterten Funktionen Serverseitig und was ich damit anstellen kann. Also da werden ich mindestens etwas auf der Client-Seite brauchen (Stichwort: GUI. Irgend eine neue Funktion auf dem Server stellt mir einen Chat zur Verfügung. Eine GUI für diesen Chat werde ich schon clientseitig benötigen).
Alles was ich mir vorstellen könnte wäre, dass ich die RMI benötigten Classes übers Netz besorge. Das würde aber bedeuten, dass ich zusätzlich noch einen Webserver (gehts auch anders?) benötige, der die class-Files explizit bekommen muss. Also mal eben per Plug+Play nen JAR-File ins plugins Verzeichnis kopieren auf der Server-Seite ist ja dann nicht mehr möglch. Ich brauche die für RMI benötigten Class-Dateien ja nochmal einzeln (oder geht das dynamische Laden auch mit einem JAR-File?) für den Webserver.

Bleiglanz hat gesagt.:
- oder auf die Java5 "stubless" RMI-Clients zu setzen (Stub wird automatisch als Dynamic Proxy erzeugt)
Uff... *angst* :)
 

Bleiglanz

Gesperrter Benutzer
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/codebase.html#section4

In addition to downloading stubs and their associated classes to clients, the java.rmi.server.codebase property can be used to specify a location from which any class, not only stubs, can be downloaded.

Mal ne andere Frage: Wie soll das mit den Plugins clientseitig überhaupt aussehen, d.h. wozu benötigst du extra Stubs?

Beim Programmieren arbeitest du doch eh mit einem generischen Interface ("Generic Plugin"), warum lässt du dann das ganze nicht gleich auf dem Server?

und machst RemoteMethode:

String[] getServices

invokeService(String name)

usw. usf.

so dass man nur noch am Server jars hinzufügt??
 

mfernau

Bekanntes Mitglied
sicherlich kann ich auch anfangen Strings zu parsen und irgendwelche 'Dinge' übergeben, die ich dann Serverseitig einfach interpretiere. Aber dann kann ich auch gleich komplett von rmi weg und kann alles auf Sockets mit Strings oder von mir aus noch Objekten machen. Ich will das ja möglichst komfortabel für mich selbst machen und möglichst wenig Arbeit in den Server stecken. RMI erschien mir da schön einfach und komfortabel für so eine Aufgabe.
Ich hab mal eine Grafik erstellt (erstellen lassen), die ausdrückt, was ich versuche zu erreichen:
plugin_diagramm.png


Hier kannst Du sehen, wie das ganze funktionieren soll. Der Client und der Server haben einen Core. Diese implementieren eine für Ihre Seite entsprechendes Interface (ClientCore und ServerCore eben). Über eine Referenz auf ein ClientCore (aus PluginSicht) kann ich mir den Server geben lassen, mit dem ich verbunden bin (getServer()). Dies liefert mir eine Referenz auf ein Objekt vom Typ ServerCore. Dies kann ich nun per rmi ansprechen. Bis hier hin dürften wir noch überein stimmen. Nun rufe ich eine Methode getPlugin(NameDesPlugins) Serverseitg auf. Diese Methode durchläuft alle angemeldeten Plugins und sucht nach dem passenden Plugin. Jedes Plugin, welches auf dem Server eingeladen wurde, implementiert ein GenericPlugin-Interface. Dort wird eine Methode 'getRemoteObject()' definiert, welche das per UnicasdtRemoteObject.exportObject(Remote object) exportierte Objekt zurück liefert. Eben ein Objekt vom Typ 'Remote', welches das Plugin ja mitliefert. Deswegen liefert die Methode 'getPlugin(name)' vom Server-Core ein Objekt vom Typ 'Remote' zurück. Das Plugin, welches diese Methode auf dem Server-Core aufgerufen hat, weiss ja, um welches konkrete Objekt es sich handelt und castet es entsprechend (also jetzt wieder das Plugin auf der Client-Seite). Hier entsteht nun die Exception, welches ja mein Problem darstellt. Angenommen ich hätte dieses Problem nicht und alles würde wunderbar klappen, so könnte ich nun ganz bequem die rmi-Methoden des Plugins auf der Server-Seite aufrufen, ohne den Umstand über irgendwleche indirekten Calls per String zu machen, die obendrein noch umständlich interpretiert werden müssten. Ganz zu schweingen von der Möglichkeit variable Objekte überteragen zu können für Plugins. Diese müsste ich dann in andere Objekte Kapseln und serverseitig wieder auspacken und benutzen. RMI liegt doch auf der Hand? Oder irre ich mich da? Für irgendwas MUSS das Zeug doch zu gebrauchen sein...

Gruß
 

Bleiglanz

Gesperrter Benutzer
ist schon gut

für mich sieht das fast so aus, als ob du die Registry nachprogrammieren willst??

das Problem ist wahrscheinlich nur der "dynamische Classloader", wenn sich deine Plugins nicht im Classpath befinden, dann hast du IMHO den Ärger mit den "verschiedenen Stubs"

hast du das schon mal getestet: mit ant starten und alle jars im Pluginverzeichnis in den Classpath mit aufnehmen (nur mal zum Testen obs dann funktioniert)
 

mfernau

Bekanntes Mitglied
Bleiglanz hat gesagt.:
ist schon gut

für mich sieht das fast so aus, als ob du die Registry nachprogrammieren willst??
Eigentlich nicht. So schlimm sehe ich das jetzt auch nicht :) Alles was ich im prinzip möchte ist, dass ich die vom Server zurückgelieferten Remote-Objekte fernsteuern kann. Ist so eigentlich erstmal gar nicht soo ungewöhnlich. Extra dafür gibts ja schließelich das UnicastRemoteObject.exportObject. Damit man nach belieben andere Remote-Objekte nach Außen zugreifbar machen kann

Bleiglanz hat gesagt.:
das Problem ist wahrscheinlich nur der "dynamische Classloader", wenn sich deine Plugins nicht im Classpath befinden, dann hast du IMHO den Ärger mit den "verschiedenen Stubs"

hast du das schon mal getestet: mit ant starten und alle jars im Pluginverzeichnis in den Classpath mit aufnehmen (nur mal zum Testen obs dann funktioniert)
Genau so sehe ich das auch. Es ist definitiv nur dieses eine Problem. Denn starte ich mein Programm so, dass ich die JAR-Datei in den Classpath einbeziehe, dann funktioniert das Programm ohne zu murren.

Werde mir das mit dem dynamischen Laden der Stubs per Codebase wohl mal genauer überlegen müssen. Vielleicht gibt es ja noch einen halbwegs brauchbaren Kompromiss. Dann lade ich die Stubs eben per http o.ä. - Obwohl alles bereits vorhanden ist *seufz*. Irgendwie blöde...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Probleme mit dem URLClassLoader Allgemeine Java-Themen 16
J Probleme mit dem URLClassLoader Allgemeine Java-Themen 2
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
R JRE Ablaufdatum seit 7u10 - Probleme bei selbst ausgelieferter JRE bekannt? Allgemeine Java-Themen 3
H Reg Exp Probleme Allgemeine Java-Themen 5
M Classpath Probleme bei JAR Generierung Allgemeine Java-Themen 2
S Probleme mit JAVA-Installation Allgemeine Java-Themen 3
D Probleme bei for-Schleife Allgemeine Java-Themen 4
R Probleme mit Javadoc Allgemeine Java-Themen 2
G Gson Probleme Allgemeine Java-Themen 2
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
M Google App Engine macht Probleme Allgemeine Java-Themen 4
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
F 2d array probleme Allgemeine Java-Themen 2
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
T Interface Probleme Allgemeine Java-Themen 8
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
M Probleme mit String in Label übergeben. Allgemeine Java-Themen 6
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben