Portal > Foren > Java > Allgemeine Java-Programmierung > plugin engine howto
Antwort
 
Themen-Optionen
Alt 28.05.2006, 21:16 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard plugin engine howto

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();
 }
}
das finde ich irgendwie zu umständlich.
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();
 }
}
wie setzt man das jetzt um? es gibt ja seit einigen versionen für jeden thread einen eigenen context ClassLoader der für alle ladevorgänge im thread zuständig ist. wird aus diesem thread eine neuer thread erzeugt erhällt dieser den selben ClassLoader.

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.
beny_mcde ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.05.2006, 22:33 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Machen wir's kurz: http://platonos.sourceforge.net
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 16:11 Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

@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:
  1. KlasseVonPlugin1 instance = PluginClassLoader.getInstance()
  2.                            .newInstance("bs.plugin1.KlasseVonPlugin1");

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.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 16:48 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

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:
  1. public class PluginDemo {
  2.     public static void main(String args[]) {
  3.         MasterPluginClassLoader classLoader = new MasterPluginClassLoader(ClassLoader.getSystemLoader());
  4.        
  5.         File[] pluginFiles = new File("plugins").listFiles();
  6.         for(File plugin : pluginFiles) {
  7.             ClassLoader pluginLoader = new PluginClassLoader(
  8.             // theoretisch könnte man auch alle Plugins in einen URLClassLoader stecken, könnte aber dann eher zu Überschneidungen führen
  9.                         new URL[] { plugin.toURL() },
  10.                         classLoader);
  11.             classLoader.addChild(pluginLoader);
  12.             // Plugin starten ("plugin.xml" lesen und parsen oder sonstwas)
  13.         }
  14.     }
  15.    
  16.     public static class PluginClassLoader extends URLClassLoader {
  17.         private ClassLoader parent;
  18.         public PluginClassLoader(URL url, ClassLoader parent) {
  19.             super(new URL[] { url });
  20.             this.parent = parent;
  21.         }
  22.    
  23.         public Class findClass(String name) throws ClassNotFoundException {
  24.             // wir tun so, als ob wir keinen parent-ClassLoader hätten
  25.             try {
  26.                 return super.findClass(name);
  27.             } catch(ClassNotFoundException e) {
  28.                 return parent.findClass(name);
  29.             }
  30.         }
  31.     }
  32.    
  33.     public static class MasterPluginClassLoader extends ClassLoader {
  34.         private List<ClassLoader> children;
  35.    
  36.         public MasterPluginClassLoader(ClassLoader parent) {
  37.             super(parent);
  38.             children = new ArrayList<ClassLoader>();
  39.         }
  40.        
  41.         public void addChild(ClassLoader loader) {
  42.             children.add(loader);
  43.         }
  44.        
  45.         public Class findClass(String name) throws ClassNotFoundException {
  46.             for(ClassLoader child : children) {
  47.                 try {
  48.                     return child.findClass(name);
  49.                 } catch(ClassNotFoundException e) {
  50.                     // ignore
  51.                 }
  52.             }
  53.             return parent.findClass(name);
  54.         }
  55.     }
  56. }

Das ist ein _Beispiel_. Ich weiß nicht, ob es kompiliert oder gar funktioniert, aber wahrscheinlich tut es beides nicht.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 20:27 Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

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);
 ...
wenn nun über den PluginClassLoader eine klasse geladen wird, wird erst der parent classloader gefragt, wenn dieser die klasse nicht kennt wird immer weiter nach oben bis zum SystemClassLoader gefragt. wenn dieser die klasse auch nicht findet wird der unterste ClassLoader, also hier der PluginClassLoader gefragt. hierzu wird die methode findClass aufgerufen.

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....
beny_mcde ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 20:36 Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

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.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 21:37 Nach oben    #7
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

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.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 21:54 Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

Also so wie ich das verstehe geht
java Code:
  1. Klasse kl = new Klasse()
nicht solange die Klasse.class nicht in der JVM geladen ist und das laden muss halt zur Ausführzeit (AppClassLoader) oder manuell per loadClass("Klasse"); erfolgen.

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.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.05.2006, 23:16 Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

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.
beny_mcde ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:17 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44