Плагин-фреймворк для Java (PF4J)
Plugin Framework for Java (PF4J)
Плагин — это способ, с помощью которого третья сторона может расширить функциональность приложения. Плагин реализует точки расширения, объявленные приложением или другими плагинами. Также плагин может определять точки расширения.
Примечание: начиная с версии 0.9 вы можете определить расширение непосредственно в jar-файле приложения (вы не обязаны помещать расширение в плагин — вы можете рассматривать это расширение как стандартное/системное). См. WhazzupGreeting для реального примера.
Особенности и преимущества
С PF4J вы можете легко преобразовать монолитное приложение Java в модульное.
PF4J — это открытый исходный код (лицензия Apache), лёгкий (около 50 КБ) фреймворк плагинов для Java с минимальными зависимостями (только slf4j-api) и очень расширяемый (см. PluginDescriptorFinder и ExtensionFinder).
На практике PF4J представляет собой микрофреймворк, цель которого — сохранить ядро простым, но расширяемым. Я пытаюсь создать небольшую экосистему (расширения) на основе этого ядра с помощью сообщества.
В настоящее время доступны следующие расширения:
— pf4j-update (механизм обновления для PF4J);
— pf4j-spring (интеграция PF4J и Spring Framework);
— pf4j-wicket (интеграция PF4J и Wicket);
— pf4j-web (использование PF4J в веб-приложениях).
Никакого XML, только Java.
Вы можете пометить любой интерфейс или абстрактный класс как точку расширения (с помощью интерфейса-маркера ExtensionPoint) и указать, что класс является расширением с аннотацией @Extension.
Также PF4J можно использовать в веб-приложениях. Для своих веб-приложений, когда мне нужна модульность, я использую pf4j-wicket.
Компоненты
— Plugin — базовый класс для всех типов плагинов. Каждый плагин загружается в отдельный загрузчик классов, чтобы избежать конфликтов.
— PluginManager используется для всех аспектов управления плагинами (загрузка, запуск, остановка). Вы можете использовать встроенную реализацию как DefaultPluginManager, JarPluginManager или реализовать собственный менеджер плагинов, начиная с AbstractPluginManager (реализовать только фабричные методы).
— PluginLoader загружает всю информацию (классы), необходимую плагину.
— ExtensionPoint — точка в приложении, где можно вызвать пользовательский код. Это маркер интерфейса Java. Любой интерфейс Java или абстрактный класс можно пометить как точку расширения (реализует интерфейс ExtensionPoint).
— Extension — реализация точки расширения. Это аннотация Java на классе.
Как использовать
Добавить PF4J в своё приложение очень просто.
Определите точку расширения в своём приложении с помощью маркера интерфейса ExtensionPoint:
public interface Greeting extends ExtensionPoint {
String getGreeting();
}
Создайте плагин, который вносит вклад в расширение:
public class WelcomePlugin extends Plugin {
public WelcomePlugin(PluginWrapper wrapper) {
super(wrapper);
}
@Extension
public static class WelcomeGreeting implements Greeting {
public String getGreeting() {
return "Welcome";
}
}
}
В приведённом выше коде я создал плагин, который поставляется с одним расширением для точки расширения Greeting. Плагин как JAR-файл (простое решение). В этом случае добавьте метаданные плагина в файл MANIFEST.MF 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
В приведённом выше манифесте я описал плагин с идентификатором welcome-plugin
, классом org.pf4j.demo.welcome.WelcomePlugin
, версией 0.0.1
и зависимостями от плагинов x, y, z
.
Теперь вы можете работать с плагинами и расширениями в своём коде:
public static void main(String[] args) {
...
// создать менеджер плагинов
PluginManager pluginManager = new DefaultPluginManager();
// запустить и загрузить все плагины приложения
pluginManager.loadPlugins();
pluginManager.startPlugins();
// получить все расширения для точки расширения «Greeting»
List<Greeting> greetings = pluginManager.getExtensions(Greeting.class);
for (Greeting greeting : greetings) {
System.out.println(">>> " + greeting.getGreeting());
}
// остановить и выгрузить все плагины
pluginManager.stopPlugins();
pluginManager.unloadPlugins();
...
}
Вывод:
>>> Welcome
PF4J очень настраиваемый и имеет множество полезных функций. Пожалуйста, ознакомьтесь с документацией, чтобы самостоятельно оценить возможности этой библиотеки.
Документация доступна на pf4j.org.
Демонстрационные приложения доступны в папке demo.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )