Eigene Java Plugins entwickeln - wie optimal?

Status
Nicht offen für weitere Antworten.

Antimon

Mitglied
Hallo,

ich habe mich mit dem JPF beschäftigt und möchte es möglich machen, für die eigene Applikation Plugins entwickeln.

Dazu möchte ich erst mal ein eigenes Plugin entwickeln, dass recht simpel aufgebaut ist. Tutorials habe ich schon gewälzt und wie das vom Code her aussehen muss ist mir auch klar - nur eines noch nicht: Wie entwickelt man Plugins am besten?

Normalerweise sollen die Plugins aus jeweils einem JAR bestehen, das im plugins-Verzeichnis abgelegt wird und dann automatisch eingebunden wird. Nur wie erzeugt man das JAR am besten?

Möglichkeit 1 wäre, ein eigenes Projekt dafür anzulegen, den Code zu schreiben, das Ganze als JAR zu exportieren und dann in der Applikation laufen zu lassen.
Nur stellt sich mir die Frage: Wie kann ich auf den Code der Hauptapplikation zurückgreifen? Den brauche ich ja um die ganzen Klassen aus der Applikation im Plugin verwenden zu können. Und wie debugge ich vernünftig?

Die 2. Möglichkeit wäre ja, den Quelltext wie den anderen Quelltext des Programms zu behandeln, nur dass man ihn in ein eigenes Package legt, das wird dann irgendwann als JAR exportiert und steht damit als Plugin zur Verfügung. Nur wie siehts dann mit Debuggen aus, wenn der Code in der JAR ist? Und muss ich dann jedes Mal, wenn ich den Code testen möchte, erst die JAR schnüren, weil das JPF das so erwartet?

Oder seh ich irgendwas ganz verkehrt und ich kann meinen Code wie gewohnt schreiben und testen, und trotzdem eigenständige JARs erzeugen, wenn ich die Anwendung deploye und erst in dem Moment brauche ich die JARs weil vorher auf die Classes direkt zugegriffen wird?

Wäre nett wenn mich da jemand entwirren könnte, bin etwas verwirrt was das ganze angeht...
 

Antimon

Mitglied
Vom Gefühl her denke ich das auch, schliesslich ist ein Plugin ja ein Zusatzmodul, das eigenständig entwickelt wird.

Nur wie geht das dann mit Debuggen? Muss ich vor jedem Programmtest aus dem Plugin ein JAR basteln (das geht sicher automatisiert oder? Stichwort ANT-Tasks?) und das dann einbinden? Oder gehts dass ich das Hauptprogramm starte und das zumindest in der Entwicklungsphase die Plugins schon kennt? Ich nutze Eclipse, könnte das da mit den "Referenced Projects" zu tun haben bzw. dass ich den Source Path eines anderen Projekts übernehme?
 
M

maki

Gast
Nur wie geht das dann mit Debuggen?
Verstehe ehrlich gesagt nicht was du meinst...

Sollte genauso gehen wie vorher, musst halt die Abhängigkeiten (jars) zwischen den Projekten richtig eintragen.

Kenne JPF nicht, aber OSGi wäre meine erste Wahl ;)
 

Antimon

Mitglied
Hmm sorry vermutlich rede ich wirres Zeug, weil ich mir das alles irgendwie ned so vorstellen kann... ich versuch mal meine Gedanken zu ordnen.

Also, wenn ich ein Plugin entwickle, brauche ich dafür den Sourcecode der Hauptapplikation, für die Referenzen etc. und damit mir Eclipse die Imports usw. automatisch einfügen kann. Das kann ich durch Einbinden des Source-Verzeichnisses vom Hauptprogramm in mein Plugin-Projekt erreichen - ist das so richtig?

Wenn ich mein Plugin schreibe, möchte ich ab und zu die Funktionalität testen - wie geht das nun am besten? Eine main() im Plugin-Projekt bringt ja nicht viel (ausser ich will nur spezielle Funktionen testen), weil das Plugin abhängig vom Hauptprogramm ist.
Heisst das, ich muss aus dem Plugin nun eine JAR erstellen, starte dann das Hauptprogramm und debugge meinen Code?

Oder geht das auch anders? Eine Jar ist ja nur eine Ansammlung von Klassen, kann ich evtl. dem Hauptprogramm über Eclipse das Plugin-Verzeichnis includieren lassen, damit ich nicht erst eine JAR erstellen muss?

Sorry, wahrscheinlich seh ich alles zu kompliziert, aber momentan find ich den Wald vor lauter Bäumen ned...
 
M

maki

Gast
Wenn ich mein Plugin schreibe, möchte ich ab und zu die Funktionalität testen - wie geht das nun am besten? Eine main() im Plugin-Projekt bringt ja nicht viel (ausser ich will nur spezielle Funktionen testen), weil das Plugin abhängig vom Hauptprogramm ist.
Man testet am besten mit einem Framework wie JUnit, alles andere führt schnell zu Käse... ;)
Man kann Abhängigkeiten auch "mocken" oder stubs schrieben, es muss und sollte nicht nur mit den "echten" Abhängigkeiten gestest werden, JMock ist mein bevorzugtes Mock Framework.

Also, wenn ich ein Plugin entwickle, brauche ich dafür den Sourcecode der Hauptapplikation, für die Referenzen etc. und damit mir Eclipse die Imports usw. automatisch einfügen kann.
Abhängigkeiten sollten am besten nur von Interfaces bestehen, nicht von konkreten Klassen.
Es reichen fertige Jars, der Sourcecode muss nicht vorhanden sein.
 

Wildcard

Top Contributor
Ist JPF nicht eine Totgeburt? Wenn du auf etwas etabliertes wie OSGi setzen würdest, bringt die IDE auch den Debug Support mit.
 

Antimon

Mitglied
Hmm also prinzipiell habe ich nichts gegen OSGi, wenn das auch vernünftig und halbwegs einfach funktioniert...

Ich bin zwar auf der Suche nach einem geeigneten Plugin-System über OSGi gestolpert, aber habe dazu nicht so viel passende Doku gefunden und mir kam das Framework ziemlich Umfangreich vor, viel zu umfangreich für meine Bedürfnisse.

Jetzt habe ich mal versucht, mir verschiedene Tutorials anzuschauen, aber so richtig schlau bin ich nicht daraus geworden. Ich weiss zwar nun wie Abhängigkeiten zwischen Modulen hergestellt werden können und wie auf den Code anderer Module zugegriffen werden kann, aber wie ich ein Modul in meinem Programm verwenden kann ist mir noch nicht ganz geläufig.

Ich dachte mir, irgendwo in meinem Programm fange ich an, die Plugins zu initialisieren und deren Code anhand von definierten Interfaces auszuführen. Aber was ich lediglich finde, sind Anleitungen, wie ich im Eclipse über die Equinox Konsole Module einbinde und starte...

Gibt es irgendwo quasi ein Kochrezept, wie ich ein Modul vom Typ A (sprich Interface A) aus einer JAR laden und in meinem Programm ausführen kann? Oder geht das nicht so einfach? Bin leider noch etwas ratlos :-/ Wenn das geklärt wäre, könnte ich gern auf JPF verzichten und gleich das "gescheite" OSGi Framework verwenden...
 
M

maki

Gast
Gibt es irgendwo quasi ein Kochrezept, wie ich ein Modul vom Typ A (sprich Interface A) aus einer JAR laden und in meinem Programm ausführen kann?
Hast du doch schon gefunden:
Aber was ich lediglich finde, sind Anleitungen, wie ich im Eclipse über die Equinox Konsole Module einbinde und starte...
;)

Hier noch Teil 1 eines OSGi Tutorials: Hello, OSGi, Part 1: Bundles for beginners - JavaWorld
Teil 2: Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules - JavaWorld
Teil 3: Hello, OSGi, Part 3: Take it to the server side - JavaWorld
 

Wildcard

Top Contributor
Gibt es irgendwo quasi ein Kochrezept, wie ich ein Modul vom Typ A (sprich Interface A) aus einer JAR laden und in meinem Programm ausführen kann?
Bundles haben einen Activator und bekommen einen BundleContext. Im BundleContext kannst du einen Service registrieren (ein Interface). Ein anderes Bundle kann dann über den Context einen Service abfragen und bekommt eine vorher registrierte Implementierung.
Im Falle von zB Eclipse RCP gibt es zusätzlich noch ExtensionPoints die du definieren kannst und in die sich andere PlugIns einklinken.
 

Antimon

Mitglied
Hmm habe ich das richtig verstanden... ich verwalte in meinem Hauptprogramm das BundleContext... das übergebe ich allen Services, wenn ich deren start()-Methode aufrufe?

Gut, soweit kann ich noch irgendwie folgen. Was mich nur irritiert ist die Verwaltung der Plugins. Angenommen ich hätte eine Archiv-Verwaltungs-Oberfläche. Diese kann über Plugins für verschiedene Datei-Archive erweitert werden. Dazu gibts ein Plugin für zip, eins für rar, eins für gzip etc.

Ich stelle mir jetzt vor, das Hauptprogramm hat einen Ordner "plugins" - in das packe ich einfach meinetwegen ein zip-1.2.3.jar, dann noch rar-0.0.4.jar. Beim Start des Hauptprogramms durchforstet es den Ordner "plugins" und findet beide jar-Archive, identifiziert sie als Plugins und startet sie (also BundleContext an die start()-Methode übergeben).

Ist das richtig so oder ein komplett falscher Ansatz? Was mir eben noch unklar ist, ist die Geschichte bis zum Starten der Plugins...

Oder ist folgender Ansatz richtiger: Mein Hauptprogramm ist selbst ein Plugin, welches in einer Equinox-Umgebung gestartet wird und alle Erweiterungen sind Unter-Plugins, die vom Hauptprogramm-Plugin abhängig sind?

Sorry, wahrscheinlich stell ich mir die Funktionsweise von OSGi ganz anders vor als sie eigentlich gedacht ist und versteh deshalb die Zusammenhänge nicht :-/ Leider helfen mir die ganzen Tutorials grad auch nicht weiter, zwar ist beispielsweise das von Apache Felix recht gut, aber da wird auch immer beschrieben, wie man einen Service über die Apache Felix Konsole lädt, aber das soll mein Programm ja eigentlich selbst machen...
 

Wildcard

Top Contributor
Bei OSGi spricht man nicht wirklich von PlugIns, sondern von Bundles. Der Begriff PlugIns kommt erst dann ins Spiel, wenn du zB Eclipse RCP verwendest. Eclipse PlugIns sind OSGi Bundles mit einer zusätzlichen Datei (plugin.xml).
Gut, soweit kann ich noch irgendwie folgen. Was mich nur irritiert ist die Verwaltung der Plugins. Angenommen ich hätte eine Archiv-Verwaltungs-Oberfläche. Diese kann über Plugins für verschiedene Datei-Archive erweitert werden. Dazu gibts ein Plugin für zip, eins für rar, eins für gzip etc.

Ich stelle mir jetzt vor, das Hauptprogramm hat einen Ordner "plugins" - in das packe ich einfach meinetwegen ein zip-1.2.3.jar, dann noch rar-0.0.4.jar. Beim Start des Hauptprogramms durchforstet es den Ordner "plugins" und findet beide jar-Archive, identifiziert sie als Plugins und startet sie (also BundleContext an die start()-Methode übergeben).
Ich denke in so einem Fall ist Eclipse RCP das richtige für dich. Dein 'primäres' PlugIn bietet einen extension point archiveHandler an, an den sich andere PlugIns andocken und zB auf eine bestimmte Dateiendung registrieren können.
Natürlich lässt sich das auch mit reinem OSGi erledigen, Eclipse RCP ist aber spezialisiert auf genau diese Art der erweiterbaren Desktop Applikation.
 

Antimon

Mitglied
Sorry, ich schon wieder...

Irgendwie komm ich mit dem Thema nicht so ganz klar...

Einerseits denke ich dass das Ganze schon das Richtige für meine Anwendung ist, andererseits habe ich noch einige Zweifel. Grad beim Eclipse RCP - wenn ich das richtig verstanden habe, baue ich damit auf Eclipse auf und nutze es als Grundlage für meine Anwendung. Aber das möchte ich eigentlich nicht. Ich denke für den Zweck (eine möglichst kompakte und schlanke Applikation) ist das RCP zu umfangreich und überladen...

Täusche ich mich da?

Wenn ich mir Eclipse RCP - Tutorial with Eclipse 3.5 (Galileo) anschaue, wird mir auch schlecht - so viel Aufwand für ein paar kleinere Plugins, rentiert sich das? Ich meine, ich brauche keine Views, keine Perspectives etc.

Meine Applikation ist eine Visualisierung für eine Gebäudeautomatisierung. Dort werden z.B. Schaltzustände von Licht, etc. grafisch dargestellt. Ein Plugin könnte beispielsweise eine grafische Darstellung von Dezimalwerten in Form eines Tortendiagramms sein - es bekommt einen Dezimalwert und liefert eine Grafik (vereinfacht gesagt).

Ist da Eclipse RCP nicht zu viel des Guten? Oder sehe ich das nur so und es rentiert sich auch für diesen Anwendungsfall? Bin da irgendwie hin- und hergerissen....
 

Wildcard

Top Contributor
Wenn du dir vorstellen kannst das deine Anwendung mal aus mehr als einem Screen bestehen könnte und das du später in der Lage sein willst neue Anforderungen umzusetzen ohne die halbe Anwendung neu zu schreiben, dann finde ich schon das sich modularisierung lohnt.
Aber du musst es selbst am besten wissen, für ein 1000 Zeilen Programm braucht man in der Regel kein OSGi Framework.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Input/Output Eigene Datei mit java öffnen Allgemeine Java-Themen 9
J eigene Java Bibliothek Allgemeine Java-Themen 2
J Java - Eigene DLL importieren Allgemeine Java-Themen 25
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
SuperSeppel13 Packete der Java Bibliothek ins eigene Prjekt integrieren Allgemeine Java-Themen 4
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
G eigene uhrzeit in einer java applikation führen Allgemeine Java-Themen 19
D Eigene Classes aus anderen .java-Dateien Allgemeine Java-Themen 2
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
RalleYTN Eigene ScriptEngine? Allgemeine Java-Themen 14
L Eigene Dependency Injections definieren? Allgemeine Java-Themen 4
K Eigene API erstellen? Allgemeine Java-Themen 13
T Best Practice Eigene GUI programmieren | MouseMotion Detection Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
M Output einer anderen/externen .jar in eigene JTextArea Allgemeine Java-Themen 4
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
D Eigene/r Collection/Container Allgemeine Java-Themen 3
F Eigene .jar mit anderer .jar öffnen Allgemeine Java-Themen 7
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
H Best Practice Ideensuche: Flexibel hinzufügbare eigene Parser Allgemeine Java-Themen 6
T OOP Die eigene Bruchklasse Allgemeine Java-Themen 11
P Eigene Exception Klasse Allgemeine Java-Themen 7
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
S Methoden Eigene Klasse als Rückgabewert Allgemeine Java-Themen 6
S eigene regEx schreiben Allgemeine Java-Themen 4
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
M Eigene Klasse verschlüsselt in Datei speichern Allgemeine Java-Themen 13
N Geodaten für eigene Routenplanung Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
M Eigene Factory Klasse Allgemeine Java-Themen 21
S eigene Update Funktion Allgemeine Java-Themen 5
H2SO3- getMethods(): eigene methoden rausfinden Allgemeine Java-Themen 4
C eine eigene Javadoc erstelen Allgemeine Java-Themen 3
Kr0e Eigene RMI Implementierung Allgemeine Java-Themen 3
S Eigene Bibliothek Allgemeine Java-Themen 2
M Eigene Dateiendung? Allgemeine Java-Themen 3
M Plugins für eigene Programme Allgemeine Java-Themen 3
S Eigene Events feuern Allgemeine Java-Themen 3
S Instanz in einer Klasse erstellen, und dem Konstruktor die eigene Klasse mitgeben Allgemeine Java-Themen 4
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
U Eigene "Dining Philosopher" Interpretation weckt Philos nie auf Allgemeine Java-Themen 2
0x7F800000 Wovon eigene Events für spezialisierte JComponents ableiten? Allgemeine Java-Themen 2
P Eigene Klasse kopieren die auf sich selbst refferenziert Allgemeine Java-Themen 8
G Umgebungsvariabeln auslesen (Path, Temp, oder eigene) Allgemeine Java-Themen 2
T Eigene PID ermitteln! Allgemeine Java-Themen 3
D Icon für eigene Dateiendung Allgemeine Java-Themen 7
G Eigene "Speicherverwaltung" Allgemeine Java-Themen 5
H eigene Annotations Allgemeine Java-Themen 2
S eigene Klasse die JButton extended - als Liste! Allgemeine Java-Themen 6
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
A Eigene Wrapper-Klassen Allgemeine Java-Themen 2
J Kann eigene Klasse nicht ermitteln Allgemeine Java-Themen 4
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
J OpenOffice.org Events in eigene Anwendung umleiten Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
B eigene Klassen verkaufen Allgemeine Java-Themen 2
W eigene event-Klasse, event posten Allgemeine Java-Themen 2
reibi Eigene exception mit feld "serialVersionUID" Allgemeine Java-Themen 3
M Eigene .jar in anderes Programm importieren[eclipse] Allgemeine Java-Themen 6
T Eigene Libary Allgemeine Java-Themen 6
E Eigene Exception Allgemeine Java-Themen 11
Q Bibliotheken mit ins eigene Jar aufnehmen Allgemeine Java-Themen 4
M Eigene Exception Klasse Allgemeine Java-Themen 4
M eigene Objekte vergleichen Allgemeine Java-Themen 6
K log4j - eigene Info-Ausgaben Allgemeine Java-Themen 5
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
G JWindow verschieben bei mousedragged auf eigene titelleiste Allgemeine Java-Themen 3
N Methoden in eigene Dateien auslagern? Allgemeine Java-Themen 10
B Eigene Datentypen Allgemeine Java-Themen 5
G Brauche hilfe bei JMF: Wie eigene Streaming Data Source! Allgemeine Java-Themen 4
G eigene klassen die ein jar verwenden als neues jar erstellen Allgemeine Java-Themen 4
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
R Updateprozedur ü. Internet fürs eigene Programm? Allgemeine Java-Themen 24
R Eigene Konfigurationsdatei für größere Projekte. Allgemeine Java-Themen 4
J Eigene Callback Methode? Allgemeine Java-Themen 3
S eigene evetns erstellen Allgemeine Java-Themen 5
K eigene GUI Komponente wird nicht angezeigt Allgemeine Java-Themen 3
G Eigene PrintService Implementierung. Allgemeine Java-Themen 5
C Die Konsole ins eigene Programm einbauen Allgemeine Java-Themen 5
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben