Un plugin est un moyen pour un tiers d'étendre les fonctionnalités d'une application. Un plugin implémente des points d'extension déclarés par une application ou d'autres plugins. Aussi, un plugin peut définir des points d'extension.
REMARQUE : à partir de la version 0.9, vous pouvez définir une extension directement dans le fichier jar de l'application (vous n'êtes pas obligé de mettre l'extension dans un plugin - vous pouvez voir cette extension comme une extension par défaut/système). Voir WhazzupGreeting pour un exemple réel.
Avec PF4J, vous pouvez facilement transformer une application Java monolithique en une application modulaire.
PF4J est un framework de plugin open source (licence Apache) léger (environ 100 Ko ) pour Java, avec des dépendances minimales (uniquement slf4j-api) et très extensible (voir PluginDescriptorFinder
et ExtensionFinder
).
En pratique, PF4J est un microframework qui vise à garder le noyau simple mais extensible. Nous disposons également d’un écosystème d’extensions piloté par la communauté. Pour l'instant sont disponibles ces extensions :
Pas de XML, seulement Java.
Vous pouvez marquer n'importe quelle interface ou classe abstraite comme point d'extension (avec l'interface de marqueur ExtensionPoint) et vous avez spécifié qu'une classe est une extension avec l'annotation @Extension.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
(c'est un JarPluginManager
+ ZipPluginManager
) ou vous pouvez implémenter un gestionnaire de plugins personnalisé à partir de AbstractPluginManager
(implémenter uniquement les méthodes d'usine).ExtensionPoint
).PLUGIN = un conteneur pour EXTENSION POINTS et EXTENSIONS + méthodes de cycle de vie (démarrer, arrêter, supprimer)
Un PLUGIN est similaire à un MODULE provenant d’autres systèmes. Si vous n'avez pas besoin de méthodes de cycle de vie (méthodes hook pour démarrer, arrêter, supprimer), vous n'êtes pas obligé de fournir une classe de plugin (la propriété PluginClass
du descripteur de plugin est facultative). Il vous suffit de fournir une description du plugin (id, version, auteur, ...) pour un bon suivi (votre application veut savoir qui a fourni les extensions ou les points d'extension).
C'est très simple d'ajouter pf4j dans votre application.
Définissez un point d'extension dans votre application/plugin à l'aide du marqueur d'interface ExtensionPoint :
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Créez une extension à l'aide de l'annotation @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Créez (c'est facultatif ) une classe Plugin
si vous êtes intéressé par les événements du cycle de vie du plugin (démarrage, arrêt, ...) :
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()" );
}
}
Dans le code ci-dessus, nous avons créé un plugin (bienvenue) fourni avec une extension pour le point d'extension Greeting
.
Vous pouvez distribuer votre plugin sous forme de fichier jar (la solution simple). Dans ce cas, ajoutez les métadonnées du plugin dans le fichier MANIFEST.MF
de jar :
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
Dans le manifeste ci-dessus, nous avons décrit un plugin avec l'identifiant welcome-plugin
(attribut obligatoire). Nous avons également défini une classe org.pf4j.demo.welcome.WelcomePlugin
(attribut facultatif), avec la version 0.0.1
(attribut obligatoire) et avec des dépendances aux plugins x, y, z
(attribut facultatif).
Vous pouvez désormais jouer avec des plugins et des extensions dans votre code :
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 ();
...
}
Le résultat est :
>>> Welcome
PF4J est très personnalisable et est livré avec de nombreux goodies. Veuillez lire la documentation pour découvrir par vous-même la puissance de cette bibliothèque.
La documentation est disponible sur pf4j.org
Les applications de démonstration sont disponibles dans le dossier de démonstration