Plugin engine?

Status
Nicht offen für weitere Antworten.

TobGod

Mitglied
Hallo

Ich würde gerne eine Plugin engine schreiben weis aber nicht wie man das am besten ralisiert dachte da soetwas wie bei eclipse oder bei azureus wäre beides OK.
Kann mir jemand sagen wie man soetwas macht? sowas wie bei eclipse würde mir besser gefallen weil da auch abhängigkeiten mit beachtet werden und man abhängigkeiten festlegen kann.

Könnt ihr mit da weiterhelfen?


Danke für die Hilfe
 
B

Beni

Gast
Grundsätzlich: Plugins in JARs ausliefern. Über das Manifest kann man gut die Start-Klasse angeben. Mit Reflection und einem URLClassLoader kann man die JARs auch einfach laden.

Es gibt zwei (mir bekannte) Ansätze wie man eine Pluginengine bauen kann:

passive Plugins
Der einfache Weg, die Plugins müssen einige Methoden implementieren (getAutor, getMenuEntry, ...), und werden dann irgendwohin gepappt.
Vorteil: sehr einfach zum implementieren
Nachteil: sehr unflexibel

aktive Plugins
Es werden im ganzen Programm "addX" und "removeX"-Methoden implementiert (X, das können Menüs sein, Panels die angezeigt werden, Dateiformate, ... einfach alles wovon es irgendwie mehr als eine Variante geben könnte). Ein Plugin hat Zugriff auf alle Objekte des Programmes, und kann diese Methoden beliebig oft aufrufen.
Vorteil: extrem flexibel. Du kannst sogar den grössten Teil des Haupt-Programmes als Plugin schreiben. Lediglich einige "Verwaltungsklassen" sind nicht als Plugin implementiertbar.
Nachteil: hoher Aufwand bei der Verwaltung. Es müssen viele Interfaces definiert werden, überall muss mit Listen gearbeitet werden, jeder zweite Dialog benötigt Möglichkeiten irgendwas auszuwählen...

Je nach deiner Programmiererfahrung würde ich dir 1 oder 2 empfehlen. Ich habe Variante 2 schon ausprobiert. Es ist extrem mühsam, aber das Ergebnis kann sich dann sehen lassen... (Hier ein Bildchen. Lediglich die Aufteilung des Fensters, der Titel und die "Kamera"-Fensterchen (damit meine ich nicht das, was die Kameras anzeigen) sind keine Plugins.)
 

Icewind

Bekanntes Mitglied
hm das größte problem das ich bei der überlegung zu einem pluginsystem hatte war die eindeutige identifizierung und versionifizierung von plugins.... naja hab ich immer noch ned gelöst weil ich ned dran weitergearbeitet hab...
 

TobGod

Mitglied
naja meine Kentnisse waren schon mal besser.
Ich war mal recht gut bin aber dann wieder auf die Spate PHP, MYSQL und Webentwicklung umgestiegen und deshalb so ein gaaaanz glein wenig eingerostet.

Ich weis einfach nicht wie ich die Sache umsetzten soll also wie ich am besten die verwaltungsklasse und die interfaces aufbauen soll.
könnt ihr mir da helfen und mir beispiele geben?

die realisierung dürfte gehen aber ich weis nie wie ich es am besten aufbaue so das es auch nicht zu viele resourcen frisst
 
B

Beni

Gast
Ein Beispiel kann ich dir geben.
Hier ist eine (gekürzte) Version, wie ich das mache:

So sieht ein Plugin aus:
Code:
public interface Plugin {
	/**
	 * Diese Methode wird pro Instanz des Plugins genau einmal aufgerufen, und
	 * dient als Konstruktor.
	 * @param directory Das Verzeichnis, aus dem das Plugin geladen wurde. Muss
	 * das Plugin Datein lesen/schreiben, so sollte dies in diesem Verzeichnis
	 * geschehen.
	 * @param majorID Die ID wird für eine Identifikation des Plugins benötigt, falls
	 * das Plugin Einstellungen speichern möchte.
	 */
	public void init( File directory, String majorID );
	
	/**
	 * Gibt die Hauptid dieses Plugins zurück. Dieser Wert muss dem major-Wert aus
	 * {@link #init(File, String)} entsprechen.
	 * @return Die ID
	 */
	public String getMajorID();
	
	/**
	 * Gibt eine Liste der Plugins zurück, welche geladen werden müssen, bevor
	 * dieses Plugin an die Reihe kommt. Beim Aufruf der {@link #plug(InstanceManager, PluginInserter, Plugin[]) plug}
	 * -Methode bekommt dieses Plugin die Instanzen der anderen Plugins zurück.
	 * 

	 * [b]Achtung: [/b] Sollten die Requests einen Kreis bilden, so werden
	 * die beteiligten Plugins, und alle davon abhängigen Plugins, nicht geladen!
	 * @return Die anfgeforderten Plugins oder null
	 */
	public Class<Plugin>[] getRequests();
	
	/**
	 * Diese Methode wird einmal aufgerufen, nachdem <code>init</code> und
	 * nachdem die Sprachdatei geladen wurde.

	 * Das Plugin kann mit dieser Methode seine zusätzlichen Komponenten
	 * hinzufügen.

	 * Zu dem Zeitpunkt, wenn diese Methode aufgerufen wird, sind schon alle
	 * Teile des Béziermanagers initialisiert, aber es gibt noch keine
	 * Möglichkeit auf den {@link PluginManager} zuzugreiffen. 
	 * @param inserter Der Inserter. Das Plugin kann seine verschiedenen Komponenten
	 * beim Inserter anmelden.
	 * @param requests Eine Liste der Plugins, welche nach den Angaben von
	 * {@link #getRequests() getRequests} zuerst geladen wurden. Die Reihenfolge
	 * der Plugins ist dieselbe, wie der Array von <code>getRequests</code>
	 * geliefert hat.
	 */
	public void plug( PluginInserter inserter, Plugin[] requests );

Eine Instanz dieses Interfaces wird dem Plugin übergeben, damit das Plugin an verschiedenen Stellen irgendwas hinzufügen kann:
Code:
/**
 * Der PluginInserter bietet allen Plugins ein einfaches Interface
 * um ihre Komponenten hinzuzufügen.
 */
public interface PluginInserter {
	public void addCreditPlugin( CreditPlugin plugin );
	public void addCreditPlugin( String author, String plugin );
	public void addDisplayPlugin( DisplayPlugin plugin );
	public void addStructureDisplayer( StructureDisplayer displayer );
	public void addControlPlugin( ControlPlugin plugin );
	public void addPopupPlugin( PopupPlugin plugin );
	...

Es gibt dann noch einen Plugin-Lader, der nichts anderes macht, als die JAR-Dateien zu öffnen, mit einem JARInputStream das Manifest zu lesen und anschliessend mit einem URLClassLoader die erste Klasse des Plugins lädt und instanziert.

Der ganze Sinn dahinter: man kann dem PluginInserter immerwieder neue Typen hinzufügen, und die alten Plugins müssen nicht verändert werden (der PluginInserter hat bei mir etwa 20 verschiedene Plugins). Der Inserter verlangt dann sehr spezialisierte Plugins, z.B. könnte ein MenuPlugin genau ein Menü enthalten...
 

Bleiglanz

Gesperrter Benutzer
würde dir doch das Eclipse Modell nahelegen

=> d.h. für jedes Plugin einen eigenen xml-deskriptor, der NICHT innerhalb des jars liegt; diese alle in ein Verzeichnis legen, das beim Starten gelesen wird.

Eclipse macht das, weil der ganze Classloader-Zeugs extrem langsam ist [ein Plugin wird erst geladen, wenn die Funktionalität das erste mal benötigt wird]

auch damit ist die "start-up" phase immer noch nicht so richtig schnell
 
R

Roar

Gast
was passiert eigentlich wenn PluginA eine instanz von PluginB benötigt, und umgekehrt ebenso?
 

Dukel

Top Contributor
Roar hat gesagt.:
was passiert eigentlich wenn PluginA eine instanz von PluginB benötigt, und umgekehrt ebenso?

Dann muss man die Abhängigkeiten beschreiben und darauf hinweisen, das man Plugin A installieren muss.
 
R

Roar

Gast
Dukel hat gesagt.:
Roar hat gesagt.:
was passiert eigentlich wenn PluginA eine instanz von PluginB benötigt, und umgekehrt ebenso?

Dann muss man die Abhängigkeiten beschreiben und darauf hinweisen, das man Plugin A installieren muss.
hallo, umgekehrt ebenso! pluginA braucht PluginB und PluginB braucht PluginA
 
B

Beni

Gast
Ich würd sagen, dann passiert gar nix, und die Plugins werdeneinfach nicht geladen. (Ich habs jedenfalls so gelöst).
 

Elephant

Aktives Mitglied
Hallo,

dieser Thread ist zwar schon etwas älter, aber ich habe eine Frage zu Plugins.
Bislang habe ich Plugins geladen, indem ich für jedes Plugin einen URLClassLoader erzeugt habe und die entsprechende Jar-Datei geladen habe.

Mein Problem ist nun, dass die Plugins voneinander abhängig sind, deshalb füge ich die URLs der Jar-Dateien der Plugins von denen ein Plugin abhängig ist zu dessen ClassLoader hinzu. Das heißt aber, dass die Klassen, so wie ich das verstanden habe, immer neu geladen werden müssen, da unterschiedliche ClassLoader unterschiedliche 'Klassen' erzeugen, auch wenn es die selben sind.

Deshalb wollte ich fragen, ob es sinnvoll ist, nicht für jedes Plugin einen eigenen ClassLoader zu verwenden, sondern nur einen, der alle Plugins lädt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Meeresgott Best Practice MVC mit Plugin-Feature Allgemeine Java-Themen 4
J Application mit PLugin erweitern Allgemeine Java-Themen 2
T Eclipse IDE Plugin Error Log Allgemeine Java-Themen 0
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
D Bradley Local Thresholding plugin imagej Allgemeine Java-Themen 6
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
M eigenes Seekarten-Tool (oder PlugIn?) Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
P Find Bugs plugin Allgemeine Java-Themen 2
C BlackBox-Framework - Plugin Programmierung Allgemeine Java-Themen 4
F Framework/Plugin für Tree-Darstellung in Graph Allgemeine Java-Themen 0
F Parser Framework/Plugin für Datei in Custom-Format Allgemeine Java-Themen 2
Joew0815 Best Practice Wie am besten Plugin-System erstellen? Allgemeine Java-Themen 12
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
M ImageJ: Mit PlugIn Weichzeichnungsfilter schreiben Allgemeine Java-Themen 9
X Java Plugin Befehle Allgemeine Java-Themen 2
O Plugin perfomrant implementieren Allgemeine Java-Themen 12
Y PlugIn für ImageJ Allgemeine Java-Themen 2
B Java Plugin schreiben Allgemeine Java-Themen 11
U Realisierung einer "Plugin-Schnittstelle": Allgemeine Java-Themen 12
D Checkstyle Plugin Allgemeine Java-Themen 4
schlingel Plugin-Architektur - Welche nehmen? Allgemeine Java-Themen 6
partsch Eclipse UML - Plugin Allgemeine Java-Themen 2
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
P System.out im Eclipse plugin Allgemeine Java-Themen 4
A Start von Java Plugin Allgemeine Java-Themen 2
S URLClassLoader und Eclipse Plugin Allgemeine Java-Themen 4
S Intellisense nach SVN Subclipse Plugin Allgemeine Java-Themen 2
B maven 2 error bei plugin download Allgemeine Java-Themen 7
V plugin.jar in application aus jar Allgemeine Java-Themen 2
N Java Plugin? Allgemeine Java-Themen 2
M Plugin-System Allgemeine Java-Themen 4
N Argumente für Plugin-Architektur Allgemeine Java-Themen 5
S Plugin zur Generierung von Builds Allgemeine Java-Themen 7
J Java Plugin probleme beim Laden? Allgemeine Java-Themen 3
F Probleme mit eigenem Plugin-System Allgemeine Java-Themen 3
G AI als PlugIn Allgemeine Java-Themen 2
R Synthesizer-PlugIn Allgemeine Java-Themen 4
S java plugin in firefox/chroot_x86_32 integrieren Allgemeine Java-Themen 3
L Java6 update N bekommt neues Browser-Plugin, bitte testen. Allgemeine Java-Themen 7
G Plugin (Visual Editor) in Eclipse einfügen Allgemeine Java-Themen 2
F Plugin damit M$ Word Java syntax versteht? Allgemeine Java-Themen 12
V Relative Pfade in Eclipse RCP Plugin Allgemeine Java-Themen 14
G Java-Plugin für Vista (x64)? Allgemeine Java-Themen 3
N Plugin-System: Klassen über String laden Allgemeine Java-Themen 3
J Suse + Tomcat + Sysdeo Plugin: Tomcat als user starten Allgemeine Java-Themen 2
G Eclipse RCP vs. PlugIn Allgemeine Java-Themen 2
reibi Eclipse PlugIn selber programmieren Allgemeine Java-Themen 3
M PlugIn für Klasse bauen Allgemeine Java-Themen 6
G plugin für eclipse zum kommentieren Allgemeine Java-Themen 9
N Als *.esp (Elder Scrolls Plugin) exportieren Allgemeine Java-Themen 12
C Dynamisches Nachladen von JARs (Plugin) Allgemeine Java-Themen 3
D Eigener Maven2 Plugin Server? Allgemeine Java-Themen 3
P Fehlermeldung "Die Klasse sun/plugin/javaRunTime kann n Allgemeine Java-Themen 3
S Nice Plugin in Eclipse Allgemeine Java-Themen 2
K PDF PlugIn zur Anzeige/Druck von PDF's Allgemeine Java-Themen 7
T Plugin um unbenötigte librarys zu finden Allgemeine Java-Themen 12
E Visueller Editor für Druckformulare - Plugin für Eclipse Allgemeine Java-Themen 2
rambozola jpg in mit eclipse-plugin one-jar erstellter jar-datei Allgemeine Java-Themen 2
T eigenes Browser Plugin Allgemeine Java-Themen 6
S ActiveX Java Plugin Allgemeine Java-Themen 2
G Plugin Management Allgemeine Java-Themen 2
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
T OJI-Plugin Allgemeine Java-Themen 4
pkm javax.script.ScriptEngineManager gibt mir keine Engine Allgemeine Java-Themen 4
L Template Engine entwerfen und implementieren Allgemeine Java-Themen 4
P Spielprogrammierung mit Unreal ENgine 4 Allgemeine Java-Themen 1
P Spielprogrammierung mit Unreal ENgine 4 Allgemeine Java-Themen 3
M Poker Engine Allgemeine Java-Themen 3
M Google App Engine macht Probleme Allgemeine Java-Themen 4
F Recommendation Engine Allgemeine Java-Themen 14
D Report Engine gesucht Allgemeine Java-Themen 2
T Java Sound Engine: Was liegt drunter? Allgemeine Java-Themen 7
André B. Was sollte eine Template Engine können? Allgemeine Java-Themen 3
clemson Workflow Engine Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben