it-swarm.com.de

Der beste Weg, um ein Plugin-System mit Java

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

Ist es möglich, ein benutzerfreundliches System (für Entwickler) 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?
141
Sven Lilienthal

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. Instanziiere diese Klasse, das Plugin ist einsatzbereit.

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

102
Bombe

Verwenden Sie OSGi .

Es ist das Fundament 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-Stack möchten).

40
Aaron Maenpaa

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

Wenn Sie jedoch mehr als nur grundlegende Funktionen benötigen, verwenden Sie eines der vorhandenen Frameworks.

29
Pete Kirkham
16
jan

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

Ich habe eine Woche lang 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 Netz ist mindestens drei Jahre alt, wenn nicht fünf), aber ich hatte ernsthafte Probleme, es in ein bestehendes Projekt zu integrieren, weil Probleme mit dem Glas manifestiert.

Kurz gesagt, es gibt nur wenige undurchsichtige Werkzeuge, die zum Erstellen von Manifesten verwendet werden, und sie sind nicht gut dokumentiert (BND Tools ist kaum undurchsichtig, 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-Posts waren die größte Hilfe, aber selbst die hatten kein funktionierendes System (ich habe mir Code aus dem Felix-Tutorial geholt und ihn zusammengesetzt, um das eingebettete Framework zum Laufen zu bringen). Ich habe seinen Buchentwurf gefunden, den er vor Jahren kostenlos gepostet hat. Das ist ausgezeichnet, aber die Beispiele in Eclipse funktionieren nicht, da die Unterstützung für Eclipse OSGi geändert wurde.

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

13
Sean Anderson

Ich halte es für äußerst schlecht, OSGi zur Lösung des oben genannten Problems zu empfehlen. OSGi ist "die richtige Wahl", aber für ein Szenario wie das oben beschriebene denke ich, dass entweder JPF oder ein selbst entwickeltes minimalistisches Framework ausreicht.

9
Steen

Vor Jahren habe ich ein solches Projekt gestartet und hoffe, dass es bald fertig ist. Ich habe mich von Projekten wie NetBeans und Eclipse inspirieren lassen, aber in der Zwischenzeit hat es sich etwas verä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 jedoch in vielerlei Hinsicht zur selben Zeit.

Die Grundidee, die mich motiviert hat, ist es, so einfach wie möglich zu sein, eine Java) - Anwendung ohne Trennung zwischen Webanwendungen, Desktopanwendungen oder Applet/JWS-Anwendungen zu erstellen (dies gilt natürlich nicht für die UI - noch) als Kernfunktionalität.

Ich habe das Projekt mit ein paar Zielen ins Leben gerufen:

  • es ist egal, ob Sie eine Webanwendung oder eine Desktopanwendung erstellen, Sie sollten die Anwendung auf dieselbe Weise starten, eine einfache Hauptmethode, Keine ausgefallene web.xml-Deklaration (nicht, dass ich gegen einen Standard-Webdeskriptor bin, aber Es passt nicht zu einem Plug-In-System, bei dem Sie "Servlets" hinzufügen - ich nenne sie RequestHandler (s) - dynamisch nach Ihrem Willen.
  • einfach "Erweiterungen" um einen "Erweiterungspunkt" einstecken - 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 Verbindung zur Welt von ourside herstellen end ruft die Anwendung auf und weist sie an, sich selbst an einem bestimmten Ort bereitzustellen.
  • von Maven ausgeliehen, kann er 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 (nützlich, und dies bietet im Grunde genommen Unterstützung für automatische updates - gefällt es Ihnen nicht, von Ihrer Webanwendung benachrichtigt zu werden, dass es eine neuere Version gibt, die heruntergeladen wurde und für deren Installation nur Ihre Erlaubnis erforderlich ist?.
  • grundlegende Anwendungsüberwachung des Systemzustands, E-Mail-Benachrichtigungen bei Fehlern
3
adrian.tarau