Ein Plugin ist eine Möglichkeit für Dritte, die Funktionalität einer Anwendung zu erweitern. Ein Plugin implementiert Erweiterungspunkte, die von der Anwendung oder anderen Plugins deklariert werden. Außerdem kann ein Plugin Erweiterungspunkte definieren.
HINWEIS: Ab Version 0.9 können Sie eine Erweiterung direkt im Anwendungs-JAR definieren (Sie sind nicht verpflichtet, die Erweiterung in ein Plugin einzufügen – Sie können diese Erweiterung als Standard-/Systemerweiterung sehen). Ein echtes Beispiel finden Sie unter WhazzupGreeting.
Mit PF4J können Sie eine monolithische Java-Anwendung ganz einfach in eine modulare Anwendung umwandeln.
PF4J ist ein leichtgewichtiges (ca. 100 KB ) Open-Source-Plugin-Framework (Apache-Lizenz) für Java mit minimalen Abhängigkeiten (nur slf4j-api) und sehr erweiterbar (siehe PluginDescriptorFinder
und ExtensionFinder
).
Praktisch gesehen ist PF4J ein Mikroframework, das darauf abzielt, den Kern einfach, aber erweiterbar zu halten. Wir verfügen auch über ein von der Community betriebenes Ökosystem von Erweiterungen. Derzeit sind folgende Erweiterungen verfügbar:
Kein XML, nur Java.
Sie können jede Schnittstelle oder abstrakte Klasse als Erweiterungspunkt markieren (mit der Markierungsschnittstelle ExtensionPoint) und Sie haben mit der Annotation @Extension angegeben, dass eine Klasse eine Erweiterung ist.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
verwenden (es ist ein JarPluginManager
+ ZipPluginManager
) oder Sie können einen benutzerdefinierten Plugin-Manager ausgehend von AbstractPluginManager
implementieren (implementieren Sie nur Factory-Methoden).ExtensionPoint
Schnittstelle).PLUGIN = ein Container für EXTENSION POINTS und EXTENSIONS + Lebenszyklusmethoden (Starten, Stoppen, Löschen)
Ein PLUGIN verhält sich ähnlich wie ein MODUL aus anderen Systemen. Wenn Sie keine Lebenszyklusmethoden (Hook-Methoden zum Starten, Stoppen, Löschen) benötigen, müssen Sie keine Plugin-Klasse angeben (die PluginClass
Eigenschaft des Plugin-Deskriptors ist optional). Für eine gute Nachverfolgung müssen Sie lediglich eine Beschreibung des Plugins (ID, Version, Autor usw.) angeben (Ihre Anwendung möchte wissen, wer die Erweiterungen oder Erweiterungspunkte bereitgestellt hat).
Es ist sehr einfach, pf4j in Ihre Anwendung einzufügen.
Definieren Sie einen Erweiterungspunkt in Ihrer Anwendung/Ihrem Plugin mithilfe des ExtensionPoint- Schnittstellenmarkers:
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Erstellen Sie eine Erweiterung mit der Annotation @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Erstellen Sie ( optional ) eine Plugin
-Klasse, wenn Sie an den Lebenszyklusereignissen des Plugins (Start, Stopp, ...) interessiert sind:
public class WelcomePlugin extends Plugin {
@ Override
public void start () {
System . out . println ( "WelcomePlugin.start()" );
}
@ Override
public void stop () {
System . out . println ( "WelcomePlugin.stop()" );
}
@ Override
public void delete () {
System . out . println ( "WelcomePlugin.delete()" );
}
}
Im obigen Code haben wir ein Plugin (Welcome) erstellt, das eine Erweiterung für den Greeting
Erweiterungspunkt enthält.
Sie können Ihr Plugin als JAR-Datei verteilen (die einfache Lösung). Fügen Sie in diesem Fall die Metadaten des Plugins in die Datei MANIFEST.MF
von jar ein:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: decebal
Build-Jdk: 1.6.0_17
Plugin-Class: org.pf4j.demo.welcome.WelcomePlugin
Plugin-Dependencies: x, y, z
Plugin-Id: welcome-plugin
Plugin-Provider: Decebal Suiu
Plugin-Version: 0.0.1
Im obigen Manifest haben wir ein Plugin mit der ID welcome-plugin
(obligatorisches Attribut) beschrieben. Wir haben auch eine Klasse org.pf4j.demo.welcome.WelcomePlugin
(optionales Attribut) mit Version 0.0.1
(obligatorisches Attribut) und mit Abhängigkeiten zu den Plugins x, y, z
(optionales Attribut) definiert.
Jetzt können Sie mit Plugins und Erweiterungen in Ihrem Code spielen:
public static void main ( String [] args ) {
...
// create the plugin manager
PluginManager pluginManager = new JarPluginManager (); // or "new ZipPluginManager() / new DefaultPluginManager()"
// start and load all plugins of application
pluginManager . loadPlugins ();
pluginManager . startPlugins ();
// retrieve all extensions for "Greeting" extension point
List < Greeting > greetings = pluginManager . getExtensions ( Greeting . class );
for ( Greeting greeting : greetings ) {
System . out . println ( ">>> " + greeting . getGreeting ());
}
// stop and unload all plugins
pluginManager . stopPlugins ();
pluginManager . unloadPlugins ();
...
}
Die Ausgabe ist:
>>> Welcome
PF4J ist sehr anpassbar und verfügt über viele Extras. Bitte lesen Sie die Dokumentation, um selbst die Leistungsfähigkeit dieser Bibliothek zu entdecken.
Die Dokumentation ist auf pf4j.org verfügbar
Demoanwendungen sind im Demoordner verfügbar