Um plug-in é uma forma de terceiros estenderem a funcionalidade de um aplicativo. Um plugin implementa pontos de extensão declarados por aplicativo ou outros plugins. Além disso, um plugin pode definir pontos de extensão.
NOTA: A partir da versão 0.9 você pode definir uma extensão diretamente no jar do aplicativo (você não é obrigado a colocar a extensão em um plugin - você pode ver esta extensão como uma extensão padrão/do sistema). Veja WhazzupGreeting para um exemplo real.
Com o PF4J você pode transformar facilmente uma aplicação Java monolítica em uma aplicação modular.
PF4J é uma estrutura de plug-ins de código aberto (licença Apache) leve (cerca de 100 KB ) para java, com dependências mínimas (apenas slf4j-api) e muito extensível (consulte PluginDescriptorFinder
e ExtensionFinder
).
Praticamente, PF4J é um microframework que visa manter o núcleo simples, mas extensível. Também temos um ecossistema de extensões voltado para a comunidade. Por enquanto estão disponíveis estas extensões:
Sem XML, apenas Java.
Você pode marcar qualquer interface ou classe abstrata como um ponto de extensão (com o marcador interface ExtensionPoint) e especificou que uma classe é uma extensão com a anotação @Extension.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
(é um JarPluginManager
+ ZipPluginManager
) ou pode implementar um gerenciador de plug-ins personalizado a partir de AbstractPluginManager
(implementar apenas métodos de fábrica).ExtensionPoint
).PLUGIN = um contêiner para EXTENSION POINTS e EXTENSIONS + métodos de ciclo de vida (iniciar, parar, excluir)
Um PLUGIN é semelhante a um MÓDULO de outros sistemas. Se você não precisa de métodos de ciclo de vida (métodos de gancho para iniciar, parar, excluir), você não é forçado a fornecer uma classe de plugin (a propriedade PluginClass
do descritor de plugin é opcional). Você só precisa fornecer alguma descrição do plugin (id, versão, autor, ...) para um bom rastreamento (sua aplicação quer saber quem forneceu as extensões ou pontos de extensão).
É muito simples adicionar pf4j em sua aplicação.
Defina um ponto de extensão em seu aplicativo/plugin usando o marcador de interface ExtensionPoint :
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Crie uma extensão usando a anotação @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Crie (é opcional ) uma classe Plugin
se você estiver interessado nos eventos do ciclo de vida do plugin (iniciar, parar, ...):
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()" );
}
}
No código acima criamos um plugin (bem-vindo) que vem com uma extensão para o ponto de extensão Greeting
.
Você pode distribuir seu plugin como um arquivo jar (a solução simples). Neste caso adicione os metadados do plugin no arquivo MANIFEST.MF
do 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
No manifesto acima, descrevemos um plugin com o id de welcome-plugin
(atributo obrigatório). Definimos também uma classe org.pf4j.demo.welcome.WelcomePlugin
(atributo opcional), com versão 0.0.1
(atributo obrigatório) e com dependências dos plugins x, y, z
(atributo opcional).
Agora você pode brincar com plug-ins e extensões em seu 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 ();
...
}
A saída é:
>>> Welcome
PF4J é muito personalizável e vem com muitas vantagens. Por favor, leia a documentação para descobrir o poder desta biblioteca.
A documentação está disponível em pf4j.org
Os aplicativos de demonstração estão disponíveis na pasta demo