Лучший способ построить систему плагинов с Java
Как бы вы внедрили систему плагинов для вашего Java-приложения?
Возможно ли иметь простую в использовании (для разработчика) систему, которая обеспечивает следующее:
- Пользователи помещают свои плагины в подкаталог приложения
- Плагин может предоставить экран конфигурации
- Если вы используете каркас, совместима ли лицензия с коммерческим развитием?
8 ответов
Во-первых, вам нужен интерфейс, который нужно реализовать всем плагинам, например
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
Авторы плагинов должны затем объединить свои плагины в файлы JAR. Ваши приложения открывают файл JAR и могут затем использовать атрибут из манифеста JAR или список всех файлов в файле JAR, чтобы найти класс, который реализует ваш интерфейс Plugin. Создав этот класс, плагин готов к работе.
Конечно, вы также можете захотеть реализовать какую-то изолированную программную среду, чтобы плагин был ограничен в том, что он может и не может делать. Я создал небольшое тестовое приложение (и написал об этом в блоге), которое состоит из двух плагинов, одному из которых запрещен доступ к локальным ресурсам.
Используйте OSGi.
Это основа системы плагинов Eclipse. Equinox - это реализация Eclipse (лицензированная EPL), а Felix - реализация Apache Project (лицензированная публичная лицензия Apache).
Eclipse предоставляет конкретный пример того, как OSGi может охватывать упомянутые вами моменты (или вы можете просто построить свое приложение поверх Eclipse RCP, если вам нужен полный стек Eclipse/SWT/JFace).
Начиная с версии 1.6, существует java.util.ServiceLoader, который можно использовать, если вы хотите написать собственную простую систему.
Но если вы хотите чего-то большего, чем базовые функции, используйте одну из существующих платформ.
Используйте PF4J. Имеет поддержку Web, Spring и Wicket. Простота в использовании и создании приложений
Я работал над OSGi в течение недели - интенсивной, ничего, кроме недели OSGi. В конце концов, это был плохой сон, но я многому научился.
Мне удалось заставить работать OSGi (не просто, все примеры устарели, всему в сети не менее трех лет, если не пять), но у меня возникли серьезные проблемы с его интеграцией в существующий проект из-за проблем с баночка проявляется.
Короче говоря, есть только несколько неясных инструментов, используемых для создания манифестов, и они недостаточно хорошо документированы (BND Tools вряд ли малоизвестны, но они предназначены для определенного процесса в Eclipse). Кроме того, большая часть доступной информации OSGi не предназначена для разработчиков приложений, у которых уже есть настольное приложение.
Это делает большую часть контекста для информации туманной или неуместной. Сообщения Нила Бартлетта в блоге были самой большой помощью, но даже те, которые не смогли получить работающую систему (я взял некоторый код из учебника Феликса и собрал его вместе, чтобы развернуть встроенный фреймворк). Я нашел черновик его книги, который он бесплатно опубликовал несколько лет назад, и это прекрасно, но примеры в Eclipse не работают из-за изменений в поддержке Eclipse OSGi.
Каждый шаг является серьезным препятствием. Я постараюсь опубликовать некоторые детали здесь позже.
Я думаю, что рекомендация OSGi для решения вышеуказанной проблемы - крайне плохой совет. OSGi - это "правильный выбор", но для сценария, подобного описанному выше, я думаю, что достаточно JPF или какой-нибудь доморощенный минималистичный фреймворк.
Несколько лет назад я запустил подобный проект и надеюсь, что скоро он будет готов. Меня вдохновили такие проекты, как NetBeans и Eclipse, но между тем он изменился на что-то немного другое. Сейчас OSGi выглядит хорошим выбором, но у меня не было возможности сравнить его с моим проектом. Он похож на JPF, упомянутый выше, но в то же время отличается во многих отношениях.
Основная идея, которая меня мотивировала, заключается в том, чтобы как можно проще создавать Java-приложения без разделения между веб-приложениями, настольными приложениями или апплетами / приложениями JWS (конечно, это пока не распространяется на пользовательский интерфейс) в качестве основной функциональности.
Я построил проект с несколькими целями:
- Неважно, если вы создаете веб-приложение или приложение для настольного компьютера, вы должны запускать приложение таким же образом, простой основной метод, не требуя особого объявления web.xml (не то чтобы я против наличия стандартного веб-дескриптора, но это не подходит для системы плагинов, где вы добавляете "сервлеты" - я называю их RequestHandler(s) - динамически по вашему желанию).
- легко подключить "расширения" вокруг "точки расширения" - что-то из Eclipse, но другой подход.
- самораскрывающийся, поскольку все плагины зарегистрированы (файлы XML), приложение должно быть самораскрываемым независимо от системы сборки - конечно, есть задача Ant и Maven MOJO, которые являются связями с миром weside, но в В завершение он вызывает приложение и дает указание самостоятельно развернуться в определенном месте.
- Позаимствованный у Maven, он может загружать код из репозиториев (включая репозитории Maven 1 и 2), так что ваше приложение может быть развернуто в виде одной маленькой банки, если у вас есть доступ к репозиториям (полезно когда-то, и в основном это обеспечивает поддержку автоматического обновления - разве вам не нравится идея получать уведомления от вашего веб-приложения о том, что есть более новая версия, она была загружена и вам просто нужно ваше разрешение для ее установки? Я знаю, что мне это нравится).
- базовый мониторинг работоспособности системы, уведомления по электронной почте в случае сбоев