Лучший способ создания плагиновой системы с Java

Как бы вы реализовали плагин-систему для своего приложения Java?

Возможно ли иметь простую в использовании (для разработчика) систему, которая обеспечивает следующее:

  • Пользователи помещают свои плагины в подкаталог приложения
  • Плагин может предоставить экран конфигурации
  • Если вы используете фреймворк, совместима ли лицензия с коммерческим развитием?

Ответ 1

Сначала вам нужен интерфейс, который необходимо реализовать всем плагинам, например

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Авторы плагинов должны затем объединить свои плагины в файлы JAR. Ваши приложения открывают JAR файл и затем могут использовать атрибут из манифеста JAR или список всех файлов в JAR файле, чтобы найти класс, который реализует ваш интерфейс Plugin. Создайте этот класс, плагин готов к работе.

Конечно, вы также можете реализовать какую-то песочницу, чтобы плагин был ограничен тем, что он может и чего не может сделать. Я создал небольшое тестовое приложениеопубликовал блог об этом), который состоит из двух плагинов, одному из которых запрещен доступ к локальным ресурсам.

Ответ 2

Используйте OSGi.

Это основа системы плагинов Eclipse. Equinox - это реализация Eclipse (лицензированная EPL) и Felix - это реализация проекта Apache (лицензированная публичная лицензия Apache).

Eclipse предоставляет конкретный пример того, что OSGi может охватывать упомянутые вами вопросы (или вы можете просто создать приложение поверх Eclipse RCP, если вам нужен полный стек Eclipse/SWT/JFace).

Ответ 3

Начиная с версии 1.6, был java.util.ServiceLoader, который можно использовать, если вы хотите закодировать свою собственную простую систему.

Но если вы хотите что-то большее, чем базовые функции, используйте одну из существующих фреймворков.

Ответ 5

Я работал над OSGi в течение недели - напряженной, ничего, кроме недели OSGi. В конце это было похоже на неудачный сон, но я многому научился.

Мне удалось заставить OSGi работать (нелегко, все примеры устарели, все в сети - не менее трех лет, если не пять), но у меня возникли серьезные проблемы с его интеграцией в существующий проект из-за проблемы с манифестовыми банками.

Короче говоря, для создания манифестов используются лишь несколько неясных инструментов, и они недостаточно хорошо документированы (BND Tools вряд ли неясен, но предназначен для определенного процесса в Eclipse). Кроме того, большая часть доступной информации OSGi не предназначена для разработчиков приложений, у которых есть существующее настольное приложение.

Это делает большой контекст для информации туманной или неуместной. Сообщения блога Neil Bartlett были самой большой помощью, но даже тем, кто не смог получить рабочую систему (я схватил некоторый код из учебника Felix и собрал его вместе, чтобы запустить встроенную фреймворк). Я нашел его проект книги, который он опубликовал бесплатно несколько лет назад, что отлично, но примеры в Eclipse не работают из-за изменений в поддержке Eclipse OSGi.

Каждый шаг является основным препятствием. Я попытаюсь опубликовать некоторые подробности здесь позже.

Ответ 6

Я думаю, что рекомендовать OSGi для решения вышеуказанной проблемы является крайне плохой совет. OSGi - это "правильный выбор", но для сценария, описанного выше, я думаю, что достаточно JPF или некоторых доморощенных минималистических рамок.

Ответ 7

Используйте PF4J. Он поддерживает Web, Spring и Wicket. Простота в использовании и построение приложений

Ответ 8

Несколько лет назад я начал проект вроде этого, и я надеюсь, что скоро он будет готов. Меня вдохновили такие проекты, как NetBeans и Eclipse, но между тем он изменился на что-то немного другое. OSGi теперь выглядит хорошим выбором, но у меня не было возможности сравнить его с моим проектом. Это похоже на JPF, упомянутый выше, но в то же время различный по-разному.

Основная идея, которая мотивировала меня, состоит в том, чтобы как можно проще создать Java-приложение без разделения между веб-приложениями, настольными приложениями или апплетами/JWS-приложениями (конечно, это не распространяется на пользовательский интерфейс) основной функциональности.

Я построил проект с несколькими целями в голове:

  • Неважно, если вы создаете веб-приложение или настольное приложение, вы должны запустить приложение таким же образом, простой основной метод, отсутствие фантазии объявления web.xml(не то, что я против наличия стандартной сети дескриптор, но он не очень хорошо работает с подключаемой системой, где вы добавляете "сервлеты" - я называю их RequestHandler (s) - динамическими по вашей воле).
  • легко подключить "расширения" вокруг "точки расширения" - что-то от Eclipse, но другой подход.
  • самораспаковывающийся, поскольку все плагины зарегистрированы (файлы XML), приложение должно саморазвертываться независимо от системы сборки - конечно, есть задача Ant и Maven MOJO, которые являются связями с нашей стороной мир, но в конце он вызывает приложение и инструктирует его самостоятельно развертывать себя в определенном месте.
  • взятый у Maven, он может загружать код из репозиториев (включая репозитории Maven 1 и 2), поэтому ваше приложение может быть развернуто как одна маленькая банка, если у вас есть доступ к репозиториям (полезно когда-то, и в основном это обеспечивает поддержку для автоматических обновлений - вам не нравится идея, чтобы ваше веб-приложение уведомлялось о том, что есть более новая версия, она была загружена, и вам просто нужно ваше разрешение на ее установку? Я знаю, что мне это нравится.
  • мониторинг основных приложений о состоянии системы, уведомления по электронной почте в случае сбоев