Плагин — это способ третьей стороны расширить функциональность приложения. Плагин реализует точки расширения, объявленные приложением или другими плагинами. Также плагин может определять точки расширения.
ПРИМЕЧАНИЕ. Начиная с версии 0.9, вы можете определить расширение непосредственно в jar-файле приложения (вы не обязаны помещать расширение в плагин — вы можете видеть это расширение как расширение по умолчанию/системное расширение). Реальный пример см. в WhazzupGreeting.
С PF4J вы можете легко превратить монолитное Java-приложение в модульное приложение.
PF4J — это легкая (около 100 КБ ) платформа плагинов с открытым исходным кодом (лицензия Apache) для Java, с минимальными зависимостями (только slf4j-api) и очень расширяемая (см. PluginDescriptorFinder
и ExtensionFinder
).
Фактически PF4J — это микрофреймворк, цель которого — сохранить простоту ядра, но при этом его расширяемость. У нас также есть экосистема расширений, управляемая сообществом. На данный момент доступны следующие расширения:
Никакого XML, только Java.
Вы можете пометить любой интерфейс или абстрактный класс как точку расширения (с помощью маркерного интерфейса ExtensionPoint), и вы указали, что класс является расширением с аннотацией @Extension.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
(это JarPluginManager
+ ZipPluginManager
) или реализовать собственный менеджер плагинов, начиная с AbstractPluginManager
(реализовать только фабричные методы).ExtensionPoint
).ПЛАГИН = контейнер для ТОЧЕК РАСШИРЕНИЯ и РАСШИРЕНИЙ + методов жизненного цикла (запуск, остановка, удаление)
ПЛАГИН аналогичен МОДУЛЮ из других систем. Если вам не нужны методы жизненного цикла (методы-перехватчики для запуска, остановки и удаления), вам не обязательно предоставлять класс плагина (свойство PluginClass
из дескриптора плагина является необязательным). Вам нужно только предоставить некоторое описание плагина (идентификатор, версия, автор и т. д.) для хорошего отслеживания (ваше приложение хочет знать, кто предоставил расширения или точки расширения).
Добавить pf4j в ваше приложение очень просто.
Определите точку расширения в вашем приложении/плагине, используя маркер интерфейса ExtensionPoint :
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Создайте расширение, используя аннотацию @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Создайте ( необязательно ) класс Plugin
, если вас интересуют события жизненного цикла плагина (запуск, остановка,...):
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()" );
}
}
В приведенном выше коде мы создали плагин (приветствие), который имеет одно расширение для точки расширения Greeting
.
Вы можете распространять свой плагин в виде jar-файла (простое решение). В этом случае добавьте метаданные плагина в файл jar MANIFEST.MF
:
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
В приведенном выше манифесте мы описали плагин с идентификатором welcome-plugin
(обязательный атрибут). Мы также определили класс org.pf4j.demo.welcome.WelcomePlugin
(необязательный атрибут) с версией 0.0.1
(обязательный атрибут) и с зависимостями от плагинов x, y, z
(необязательный атрибут).
Теперь вы можете экспериментировать с плагинами и расширениями в своем коде:
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 ();
...
}
Результат:
>>> Welcome
PF4J легко настраивается и содержит множество полезных функций. Пожалуйста, прочитайте документацию, чтобы открыть для себя возможности этой библиотеки.
Документация доступна на pf4j.org.
Демо-приложения доступны в папке demo.