Un complemento es una forma que tiene un tercero de ampliar la funcionalidad de una aplicación. Un complemento implementa puntos de extensión declarados por la aplicación u otros complementos. Además, un complemento puede definir puntos de extensión.
NOTA: A partir de la versión 0.9, puede definir una extensión directamente en el archivo jar de la aplicación (no está obligado a colocar la extensión en un complemento; puede ver esta extensión como una extensión predeterminada/del sistema). Consulte WhazzupGreeting para ver un ejemplo real.
Con PF4J puedes transformar fácilmente una aplicación Java monolítica en una aplicación modular.
PF4J es un marco de complemento liviano (alrededor de 100 KB ) de código abierto (licencia Apache) para Java, con dependencias mínimas (solo slf4j-api) y muy extensible (consulte PluginDescriptorFinder
y ExtensionFinder
).
En la práctica, PF4J es un microframework que pretende mantener el núcleo simple pero extensible. También tenemos un ecosistema de extensiones impulsado por la comunidad. Por ahora están disponibles estas extensiones:
Sin XML, solo Java.
Puede marcar cualquier interfaz o clase abstracta como un punto de extensión (con el marcador de interfaz ExtensionPoint) y especificó que una clase es una extensión con la anotación @Extension.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
(es JarPluginManager
+ ZipPluginManager
) o puede implementar un administrador de complementos personalizado a partir de AbstractPluginManager
(implemente solo métodos de fábrica).ExtensionPoint
).PLUGIN = un contenedor para PUNTOS DE EXTENSIÓN y EXTENSIONES + métodos de ciclo de vida (iniciar, detener, eliminar)
Un PLUGIN es similar a un MÓDULO de otros sistemas. Si no necesita métodos de ciclo de vida (métodos de enlace para iniciar, detener, eliminar), no está obligado a proporcionar una clase de complemento (la propiedad PluginClass
del descriptor del complemento es opcional). Sólo necesita proporcionar alguna descripción del complemento (id, versión, autor, ...) para un buen seguimiento (su aplicación quiere saber quién proporcionó las extensiones o los puntos de extensión).
Es muy sencillo agregar pf4j en su aplicación.
Defina un punto de extensión en su aplicación/complemento usando el marcador de interfaz ExtensionPoint :
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Cree una extensión usando la anotación @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Cree (es opcional ) una clase Plugin
si está interesado en los eventos del ciclo de vida del complemento (inicio, detención,...):
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()" );
}
}
En el código anterior hemos creado un complemento (bienvenido) que viene con una extensión para el punto de extensión Greeting
.
Puede distribuir su complemento como un archivo jar (la solución simple). En este caso, agregue los metadatos del complemento en el archivo MANIFEST.MF
del 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
En el manifiesto anterior, describimos un complemento con la identificación de welcome-plugin
(atributo obligatorio). También hemos definido una clase org.pf4j.demo.welcome.WelcomePlugin
(atributo opcional), con versión 0.0.1
(atributo obligatorio) y con dependencias de los complementos x, y, z
(atributo opcional).
Ahora puedes jugar con complementos y extensiones en tu código:
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 ();
...
}
La salida es:
>>> Welcome
PF4J es muy personalizable y viene con muchas ventajas. Lea la documentación para descubrir usted mismo el poder de esta biblioteca.
La documentación está disponible en pf4j.org
Las aplicaciones de demostración están disponibles en la carpeta de demostración.