Der beste Weg, um ein Plugin-System mit Java zu erstellen

145

Wie würden Sie ein Plugin-System für Ihre Java-Anwendung implementieren?

Ist es möglich, ein einfach zu bedienendes (für den Entwickler) System zu haben, das Folgendes erreicht:

  • Benutzer legen ihre Plugins in einem Unterverzeichnis der App ab
  • Das Plugin kann einen Konfigurationsbildschirm bereitstellen
  • Wenn Sie ein Framework verwenden, ist die Lizenz mit der kommerziellen Entwicklung kompatibel?
Sven Lilienthal
quelle

Antworten:

107

Zuerst benötigen Sie eine Schnittstelle, die alle Plugins implementieren müssen, z

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Plugin-Autoren sollten ihre Plugins dann in JAR-Dateien bündeln. Ihre Anwendungen öffnen die JAR-Datei und können dann ein Attribut aus dem JAR-Manifest oder die Liste aller Dateien in der JAR-Datei verwenden, um die Klasse zu finden, die Ihre Plugin-Schnittstelle implementiert. Instanziieren Sie diese Klasse, das Plugin ist einsatzbereit.

Natürlich möchten Sie möglicherweise auch eine Art Sandboxing implementieren, damit das Plugin in seinen Möglichkeiten eingeschränkt ist und nicht. Ich habe eine kleine erstellte Testanwendung (und darüber gebloggt ) , die aus zwei Plugins besteht, von denen Zugriff auf lokale Ressourcen verweigert wird.

Bombe
quelle
2
Der Sandkasten, den Sie erwähnen, ist tatsächlich der schwierigste Teil! aber nicht zu ärgern - osgi macht es schon für dich wie oben erwähnt.
Chii
1
Sandboxen ist nicht so schwierig. Ich habe ungefähr zwei Wochen gebraucht, um herauszufinden, wie man es richtig macht, aber sobald Sie wissen, dass es ziemlich einfach ist. :)
Bombe
@Bombe lebt diese Beispielanwendung noch irgendwo?
Ataulm
* unter Verwendung des Anhangs unter bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm
@ timberwo7ves Ich verstehe nicht was du meinst. Die Dateitestanwendung kann weiterhin von dem im Beitrag angegebenen Speicherort und von der von Ihnen genannten Seite heruntergeladen werden.
Bombe
41

Verwenden Sie OSGi .

Es ist die Grundlage des Eclipse-Plug-In-Systems. Equinox ist die Implementierung von Eclipse (lizenzierte EPL) und Felix ist die Implementierung des Apache-Projekts (lizenzierte öffentliche Apache-Lizenz).

Eclipse bietet ein konkretes Beispiel dafür, dass OSGi die von Ihnen genannten Punkte abdecken kann (oder Sie können Ihre Anwendung einfach auf Eclipse RCP aufbauen, wenn Sie einen vollständigen Eclipse / SWT / JFace-Stapel wünschen).

Aaron Maenpaa
quelle
4
Ich habe mich mit OSGi beschäftigt, aber nie eine wirklich gute Grundierung dafür gefunden. Es wäre toll, wenn jemand hier einige Links empfehlen könnte.
Brian Matthews
1
Ich habe Equinox in meine Anwendung eingebettet und Standard-OSGi-Praktiken verwendet, um genau das zu tun, was das OP will. Auch im Schwung, nicht SWT. Webstarted auch. gute Startressource
Basszero
3
OSGi ist idealerweise das De-facto-Plugin-System. Der Sprung vom Standard-Java zum OSGi-Programmiermodell ist jedoch ziemlich groß ...
Hendy Irawan
30

Seit 1.6 gibt es java.util.ServiceLoader, der verwendet werden kann, wenn Sie Ihr eigenes einfaches System codieren möchten.

Wenn Sie jedoch mehr als nur grundlegende Funktionen wünschen, verwenden Sie eines der vorhandenen Frameworks.

Pete Kirkham
quelle
16

Es gibt auch JPF (Java Plugin Framework) .

jan
quelle
Hat hier jemand JPF verwendet? Klingt interessant
Sven Lilienthal
1
JabRef verwendet JPF für seine Plugins. Funktioniert ganz gut.
Koppor
Ich benutze JPF, aber es ist eng mit Ant gekoppelt. Ich möchte es loswerden, weiß aber nicht, wie viel Einfluss es auf meine Anwendung haben wird.
MartinL
Ich habe ein JPF-Plugin für ein Open Source-Produkt (OpenEMM) erstellt. Ich konnte es mit maven (Maven-Assembly-Plugin) schaffen; Natürlich schätze ich die Einfachheit der Entwicklung sehr, auch jetzt ist es wahrscheinlich OSGI, das populärer ist.
Februar
Gibt es Einschränkungen für Java-Versionen für die Verwendung von JPF?
Madhav
16

Verwenden Sie PF4J . Es unterstützt Web, Spring und Wicket. Einfach zu bedienen und die Anwendungen zu erstellen

Mallikarjuna Sangisetty
quelle
Ich finde, dass dies das ist, was ich brauche und es scheint ziemlich einfach zu sein, aber ich brauche etwas Hilfe
nonybrighto
Versuchen Sie, Decebal auf Github Fragen zu stellen. er wird dir helfen
Daniel Jipa
Siehe Meta.stackoverflow.com/questions/376686/… zum Decebals-Kontostatus hier
Wolfgang Fahl
1
Wenn Sie sich pf4j ansehen, können Sie sich auch github.com/hank-cp/sbp ansehen . Es basiert auf pf4j und unterstützt Spring Boot beim Erstellen einer vollständigen Webanwendung.
Hank
13

Ich habe eine Woche an OSGi gearbeitet - eine intensive, nichts als OSGi-Woche. Am Ende war es wie ein böser Traum, aber ich habe viel gelernt.

Ich konnte OSGi zum Laufen bringen (nicht einfach, alle Beispiele sind veraltet, alles im Internet ist mindestens drei Jahre alt, wenn nicht fünf), aber ich hatte aufgrund von Problemen mit dem Betriebssystem ernsthafte Probleme, es in ein bestehendes Projekt zu integrieren Glas manifestiert sich.

Kurz gesagt, es gibt nur wenige undurchsichtige Werkzeuge, die zum Erstellen von Manifesten verwendet werden, und sie sind nicht gut dokumentiert (BND-Werkzeuge sind kaum dunkel, aber für einen bestimmten Prozess in Eclipse konzipiert). Außerdem richten sich die meisten verfügbaren OSGi-Informationen nicht an Anwendungsentwickler, die über eine vorhandene Desktop-Anwendung verfügen.

Dies macht einen Großteil des Kontexts für die Informationen neblig oder unangemessen. Neil Bartletts Blog-Beiträge waren die größte Hilfe, aber selbst diese haben kein funktionierendes System erhalten (ich habe Code aus dem Felix-Tutorial genommen und ihn zusammengesetzt, um das eingebettete Framework ins Rollen zu bringen). Ich habe seinen Buchentwurf gefunden, den er vor Jahren kostenlos veröffentlicht hat, was ausgezeichnet ist, aber die Beispiele in Eclipse funktionieren aufgrund von Änderungen in der Eclipse OSGi-Unterstützung nicht.

Jeder Schritt ist eine große Hürde. Ich werde später versuchen, hier weitere Details zu veröffentlichen.

Sean Anderson
quelle
17
Wie ist das eine Antwort? Es geht eher um OSGi, und Sie erklären nicht einmal, was OSGi ist.
Stealth Rabbi
@StealthRabbi Zum Zeitpunkt dieser "Antwort" und für einige Zeit danach waren es gute Informationen für jemanden, der versucht, mit OSGi in freier Wildbahn zu arbeiten. OSGi war bereits Teil der Diskussion - es bestand also keine Notwendigkeit, es zu definieren. Dies ist insofern eine Antwort, als es den Menschen möglicherweise eine Woche Arbeit erspart hat - der ganze Grund für SO.
Sean Anderson
9

Ich denke, dass die Empfehlung von OSGi zur Lösung des oben genannten Problems ein äußerst schlechter Rat ist. OSGi ist "die richtige Wahl", aber für ein Szenario wie das oben genannte halte ich entweder JPF oder ein einheimisches minimalistisches Framework für ausreichend.

Steen
quelle
3

Vor Jahren habe ich ein solches Projekt gestartet und ich hoffe, dass es bald fertig sein wird. Ich habe mich von Projekten wie NetBeans und Eclipse inspirieren lassen, aber in der Zwischenzeit hat sich etwas anderes geändert. OSGi scheint jetzt eine gute Wahl zu sein, aber ich hatte keine Gelegenheit, es mit meinem Projekt zu vergleichen. Es ähnelt dem oben erwähnten JPF, unterscheidet sich aber gleichzeitig in vielerlei Hinsicht.

Die Grundidee, die mich motiviert hat, ist es, Java-Anwendungen so einfach wie möglich zu erstellen, ohne Trennung zwischen Webanwendungen, Desktop-Anwendungen oder Applet / JWS-Anwendungen (natürlich wird die Benutzeroberfläche noch nicht abgedeckt) als Kernfunktionalität.

Ich habe das Projekt mit ein paar Zielen aufgebaut:

  • Es spielt keine Rolle, ob Sie eine Webanwendung oder eine Desktopanwendung erstellen, Sie sollten die Anwendung auf die gleiche Weise starten, eine einfache Hauptmethode, keine ausgefallene web.xml-Deklaration (nicht, dass ich gegen einen Standard-Webdeskriptor bin, aber Es passt nicht gut zu einem Plug-In-System, bei dem Sie "Servlets" hinzufügen - ich nenne sie RequestHandler (s) - dynamisch nach Ihrem Willen).
  • Einfache Erweiterung von "Erweiterungen" um einen "Erweiterungspunkt" - etwas von Eclipse, aber ein anderer Ansatz.
  • Selbstbereitstellbar, da alle Plugins registriert sind (XML-Dateien), muss die Anwendung unabhängig vom Build-System selbstbereitstellbar sein - natürlich gibt es eine Ant-Task und ein Maven MOJO, die die Verbindungen zur Welt von ourside darstellen, aber in der Beenden Sie die Anwendung und weisen Sie sie an, sich an einem bestimmten Speicherort selbst bereitzustellen.
  • Von Maven ausgeliehen, kann es Code aus Repositorys (einschließlich Maven 1 & 2-Repositorys) herunterladen, sodass Ihre Anwendung als einzelnes kleines Glas bereitgestellt werden kann, solange Sie Zugriff auf die Repositorys haben (manchmal nützlich, und im Grunde bietet dies Unterstützung für die automatische Speicherung). Updates - Lieben Sie es nicht, von Ihrer Webanwendung benachrichtigt zu werden, dass es eine neuere Version gibt, die heruntergeladen wurde und nur Ihre Erlaubnis zur Installation benötigt? Ich weiß, dass ich das liebe.
  • Grundlegende Anwendungsüberwachung über den Systemzustand, E-Mail-Benachrichtigungen bei Fehlern
adrian.tarau
quelle
2
Ich will nicht nörgeln, aber hast du seitdem daran gearbeitet? Ist der Code verfügbar (ich kann ihn möglicherweise unverändert verwenden oder ergänzen)?
Piccolo