Laden von Bibliotheken

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

ich habe folgendes Problem. Ich schreibe an einem Plugin welches wieder Plugins haben kann und ich müsste das jar wo die interfaces für die kommunikation zwischen plugin -> plugin enthalten sind nachträglich laden da es ja keinen
Sinn macht diese im CP vom Main Programm zu haben.

Aufbau:

Mainprogramm -> Plugin (Ebene1) -> Plugin (Ebene2)


Ebene 1 und Mainprogramm kommunizieren ganz normal da dem Mainprogramm seine Interfaces bekannt sind. Leider schaffe ich es nicht das Ebene 1 ein Plugin der Ebene2 läd. Knackpunkt ist folgender Code

Code:
JarClassLoader jarLoader = new JarClassLoader(this.pluginFile.getAbsolutePath());
String className = jarLoader.getClassNamefromManifest();
Class c = jarLoader.loadClass(className, true);
Object o = c.newInstance();

if(o instanceof IEbene2Plugin) {
   this.plugin = (IEbene2Plugin) o;
}


Wenn ich das jar mit den Interfaces (IEbene2Plugin) im Mainprogramm im CP habe dann is es kein Problem und er geht in den If-Zweig, falls nicht erkennt er nur den Typ der Klasse aber nicht das sie ein Interface implementiert. Also er denkt o ist Plugin aber Plugin implements IEbene2Plugin.

Gibt es ne Möglichkeit wie ich dem Ebene1Plugin die Interfaces dynamisch nachladen kann oder eine andere Möglichkeit ausser das Mainprogramm zu manipulieren. Bei nem Plugin ist es ja nicht schön wenn man dafür das Mainprogramm verändern muss ^^.

Danke

Andi
 
Soll das heißen das IEbene2Plugin im Ebene2 Plugin definiert wurde welches erst zur Laufzeit bekannt gemacht wird?
Das funktioniert nicht, da es sowas wie dynamisches Casten nicht gibt.
Plugins haben sich an ein Interface zu halten, und bringen nicht selbst eins mit...währ' ja noch schöner :lol:
 
Ne ne, es gibt eine jar-File das 2 Interfaces enthält, eines davon ist das Interface IEbene2Plugin das definiert wie ein Ebene2Plugin auszusehen hat. Jedes Plugin von ebene2 muss dieses Interface aus der jar-datei implementieren.

Code:
JarClassLoader jarLoader = new JarClassLoader(this.pluginFile.getAbsolutePath());
String className = jarLoader.getClassNamefromManifest();
Class c = jarLoader.loadClass(className, true);
Object o = c.newInstance();

if(o instanceof IEbene2Plugin) {
   this.plugin = (IEbene2Plugin) o;
}

ist ein Stück aus einem Ebene1Plugin wo ich quasi ein Plugin der Ebene2 lade und mir ein Objekt davon erzeuge.

this.plugin ist ein IEbene2Plugin (klar sonst würde die Zuweisung ja nicht gehen). Und natürlich muss die Mainklasse des Ebene2Plugins das ich mir mit

Code:
String className = jarLoader.getClassNamefromManifest();
Class c = jarLoader.loadClass(className, true);
Object o = c.newInstance();

erzeuge auch vom Typ IEbene2Plugin sein. Ebene1 durchsucht nen pluginordner ob da jar-files sind und läd quasi immer die mainklasse der einzelnen jar files. Diese mainklassen müssen alle das interface IEbene2Plugin implementieren.

Und genau da liegt das Problem. Gestartet wird das ganze ja vom Mainprogramm welches dann mit dem gleichen Mechanismus mein Ebene1Plugin startet. dieses wiederum versucht dann alle Ebene2Plugins zu laden.

Aber das jar mit den dafür nötigen Interfaces wird und darf nicht schon vom Mainprogramm geladen werden (also im CP sein) da das einfach schlechte Plugin-methode währe da ein Plugin immer unabhängig vom Mainprogramm sein sollte bis auf die dafür zuständige Schnittstelle.

Füge ich das jar mit den Interfaces dem CP des Mainprogramms hinzu gibts kein problem weil dann Ebene1Plugin erkennt das Ebene2Plugin das Interface IEbene2Plugin implementiert. Ist das jar nicht im CP er kennt es nur eine Klasse die das Interface implementiert.
 
in der letzten Zeile muss es heißen "die das Interface nicht implementiert"
 
weis denn keiner ob das möglich ist so Bibliotheken nachzuladen oder so?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben