![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Erfahrener Benutzer Registriert seit: 28.08.2004 Ort: konstanz am bodensee
Beiträge: 190
|
hallo allerseits. bingerade dabei mir gedanken zu einer plugin engine zu machen. das ganze soll generisch sein, d.h. in verschiedenen anwendungen einsetzbar zu sein. die plugins sollen beim starten nicht im klassenpfad aufgenommen werden müssen, d.h. die klassen eines plugins werden später über einen URLClassLoader oder einem eigenbau geladen. es soll abhängigkeiten zwischen den plugins geben können. also plugin2 verwendet klassen aus plugin1 das ist ja alles kein problem aber um dann klassen aus einem plugin in einem anderm zu instanzieren muss man sie immer beim PluginClassLoader bestellen. Code: package bs.plugin2;
public class KlasseVonPlugin2{
public KlasseVonPlugin2(){
PluginClassLoader loader = PluginClassLoader.getInstance();
Class clazz = loader.loadClass("bs.plugin1.KlasseVonPlugin1");
KlasseVonPlugin1 instance = clazz.newInstance();
}
}
da zu kompilierzeit die benötigten plugins ja zur verfügung stehen währe es schön wenn man das ganze etwa wie folgt schreiben könnte. Code: package bs.plugin2;
import bs.plugin1.*;
public class KlasseVonPlugin2{
public KlasseVonPlugin2(){
KlasseVonPlugin1 instance = new KlasseVonPlugin1();
}
}
meine idee war also am anfang dem mainthread einen context ClassLoader zuzuweisen der im stande ist pluginklassen zu laden. nur irgendwie funktioniert das nicht richtig, da die findClass methode des contextclassloaders nicht aufgerufen wird sondern gleich einen ClassNotFoundException fliegt. was ist falsch an der sache? oder geht das überhaupt garnicht? im schlimmsten fall müsste ich ja beim starten der VM einen selbstgeschriebenen SystemClassLoader mitgeben aber das wird sicher umständlich. hoffe ihr versteht was mein problem ist und habt ein paar anregungen wie man es lösen könte. |
| | |
| | Nach oben #2 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Machen wir's kurz: http://platonos.sourceforge.net |
| | |
| | Nach oben #3 |
| Erfahrener Benutzer Registriert seit: 23.11.2005 Ort: Stadtallendorf
Beiträge: 139
|
@beny_mcde Ich bin mir (fast) sicher, dass für ein Plugins System nur variante 1 möglich ist. Wenn du aber einen Weg findest, dann bin ich ganz Ohr Warum kapselst du die Klassenladerei nicht in deiner PluginClassLoader? z.B. java Code:
Sowas in der Art. Man kann es noch verfeinern. Zu Platonos: Ich habe die pluginengine ausprobiert und sie ist echt eine der besten. Leider wird sie seit der Version 1.0 nicht mehr weiterentwickelt. Der Entwickler will die ganze Engine neu machen und sie dann als Version 2.0 rausbringen. Nur hat mir der Entwickler das im Herbst '05 erzählt und das ist schon ein halbes Jahr her. Wer weiß ob er noch was macht. Echt schade um die Engine, wenn nichts draus wird. Gruß KaraHead
__________________ Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag. |
| | |
| | Nach oben #4 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Tatsache? Wusste ich gar nicht - benutze diese Engine ja selbst in SimpleEdit. Na ja, aber so schlimm ist das auch nicht, weil 1.0 schon nen sehr großen Bereich an Sachen abdeckt. Deren CVS ham sie vor 8 Monaten das letzte mal benutzt. Na gut... wenn ich mich nicht ganz irre, dann hat jeder ClassLoader einen Parent-ClassLoader, d.h. sowas hier müsste theoretisch funktionieren können: java Code:
Das ist ein _Beispiel_. Ich weiß nicht, ob es kompiliert oder gar funktioniert, aber wahrscheinlich tut es beides nicht. |
| | |
| | Nach oben #5 |
| Erfahrener Benutzer Registriert seit: 28.08.2004 Ort: konstanz am bodensee
Beiträge: 190
|
hab mir die platoon engine mal angeschaut und sie scheint alle wichtigen funktionen schon zu implementieren. also scheint sie eine günstige gelegenheit zu sein um mir einiges an tipparbeit zu sparen.... oder habt ihr schon irgendwelche mängel entdeckt? @pago: mit dem parent classloader hast du recht. aber ich verstehe dein beispiel nicht ganz. normalerweisewürde man einen ClassLoader etwa so instanieren Code: MasterClassLoader master = new MasterClassLoader(); PluginClassLoader plugin1 = new PluginClassLoader(master); PluginClassLoader plugin2 = new PluginClassLoader(master); ... deswegen verstehe ich dein beispiel irgendwie nicht. da du ja im PluginClassLoader wenn er die klasse nicht findet nochmal den vater fragst... das ist ja praktisch das umgekehrte vorgehen wie es normlerweise funktioniert. im schlimmsten falle, wenn eine klasse überhauptnicht verfügbar ist wird das in einer endloßschleife enden, da der PluginClassLoader die klasse nicht findet, den parent loader fragt, der kennt aber die klasse auch nicht und ruft nun wieder die findClassMethode im PluginClassLoader auf u.s.w. hab zum thema class loading 2 gute artikel gefunden. nr1 den anderen hab ich nur auf meiner linux platte auf die ich unter windoof kein zugriff habe und find ihn bei google nicht mehr.... |
| | |
| | Nach oben #6 |
| Erfahrener Benutzer Registriert seit: 23.11.2005 Ort: Stadtallendorf
Beiträge: 139
|
Man könnt ja mal den Entwickler fragen, ob er noch was an der engine macht. Leider bin ich zu unfähig die email von ihm zu finden. JPF ist auch noch eine Plugin Engine, die mir persönlich aber überhaupt nicht gefällt. Nur zum Vergleich. Geschmäcker sind verschieden.
__________________ Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag. |
| | |
| | Nach oben #7 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Deswegen ist es nur ein Beispiel. Man müsste natürlich noch dafür sorgen, dass es nicht in ner Endlosschleife endet, d.h. der aufrufende ClassLoader müsste übersprungen werden. Ist aber auch kein Thema. |
| | |
| | Nach oben #8 |
| Erfahrener Benutzer Registriert seit: 23.11.2005 Ort: Stadtallendorf
Beiträge: 139
|
Also so wie ich das verstehe geht java Code:
Die Suchreihenfolge übernehmen dann die ClassLoader. @beny_mcde Wenn du unbedingt auf die 2. Variante bestehen willst, dann musst du die vorhandenen Plugins in deinem Plugin Ordner einfach zum Classpath hinzufügen und das Programm starten. Dann sollte es gehen. Oder rede ich an euch vorbei?
__________________ Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag. |
| | |
| | Nach oben #9 |
| Erfahrener Benutzer Registriert seit: 28.08.2004 Ort: konstanz am bodensee
Beiträge: 190
|
das geht halt warscheinlich nur mit einem eigenen SystemClassLoader, den man ja soweit ich weiß beim start der vm als argument mitgeben muss. aber ich denke die platoon engine reicht völlig aus, wenn nicht jemand noch riesige mängel hier postet. wie sagt man doch so schön bei der heirat... "wer einwände hat möge sie jetzt hervorbringen oder für immer schweigen" oder so ausserdem gibts den quellcode ja auch, ich hab die lizenz zwar nicht gelesen aber man darf ihn bestimmt verändern und erweitern. |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [ZendFramework] Weiterleiten aus einem Plugin | robo47 | PEAR, PECL und Frameworks | 8 | 12.09.2007 11:21 |
| Eclipse Plugin - Search Preference Page | Ben | Eclipse | 5 | 06.02.2007 16:20 |
| [Platoons plugin engine] libraries | beny_mcde | Allgemeine Java-Programmierung | 6 | 28.06.2006 14:03 |
| AJAX Theme Engine für Wordpress | PaterNoster | Plauderecke | 0 | 17.11.2005 21:48 |
| XML Schema GUI Engine (JAXFront) | spor | Nachrichten | 2 | 05.08.2004 17:27 |