Лучший способ построить систему плагинов с Java

145

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

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

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

Ответы:

107

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

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

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

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

Бомбы
источник
2
песочница, которую вы упоминаете, на самом деле самая сложная часть! но не волнуйтесь - osgi уже делает это для вас, как упомянуто выше.
Чи
1
Песочница не так сложна. У меня ушло около двух недель, чтобы понять, как это сделать правильно, но как только вы узнали, что это довольно просто. :)
Бомба
@Bombe этот пример приложения еще где-нибудь живет?
2012 года
* используя вложение, найденное на bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm
@ timberwo7ves Я не понимаю, что ты имеешь в виду. Приложение для проверки файлов все еще можно загрузить из местоположения, указанного в сообщении, и со страницы, которую вы упомянули.
Бомба
41

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

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

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

Аарон Маенпаа
источник
4
Я баловался с OSGi, но никогда не находил действительно хороший учебник для него. Было бы здорово, если бы кто-то мог порекомендовать здесь несколько ссылок.
Брайан Мэтьюз
1
Я встроил равноденствие в свое приложение и использовал стандартные методы OSGi, чтобы делать именно то, что хочет ОП. В разгаре тоже не SWT. Webstarted также. хороший стартовый ресурс: neilbartlett.name/blog
basszero
3
OSGi в идеале является де-факто системой плагинов. Тем не менее, переход от стандартной Java к модели программирования OSGi довольно широк ...
Хенди Ираван
30

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

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

Пит Киркхэм
источник
16

Существует также JPF (Java Plugin Framework) .

январь
источник
Кто-нибудь здесь использовал JPF? Звучит интересно
Свен Лилиенталь
1
JabRef использует JPF для своих плагинов. Работает довольно хорошо.
Коппор
Я использую JPF, но он тесно связан с Ant. Я хочу избавиться от этого, но я не знаю, какое влияние это окажет на мое приложение.
MartinL
Я создал плагин JPF для продукта с открытым исходным кодом (OpenEMM); Я смог сделать это с помощью maven (плагин maven-assembly); Конечно, я действительно ценю простоту разработки, даже сейчас, вероятно, OSGI является более популярным.
рüффп
Есть ли какие-либо ограничения на версии Java для использования JPF?
Мадхав
16

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

Малликарджуна Сангисетты
источник
я считаю, что это то, что мне нужно, и это кажется довольно простым, но мне нужна помощь в этом
nonybrighto
попробуйте задать вопросы Дечебалу на github. он поможет вам
Даниэль Джипа
см. meta.stackoverflow.com/questions/376686/… о статусе учетной записи Decebals здесь
Вольфганг Фаль
1
Если вы смотрите на pf4j, вы также можете взглянуть на github.com/hank-cp/sbp . Он построен поверх pf4j для поддержки Spring Boot для создания полноценного веб-приложения.
Хэнк
13

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

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

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

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

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

Шон Андерсон
источник
17
Как это ответ? Это скорее напыщенная речь об OSGi, и вы даже не объясняете, что такое OSGi.
Раввин Стелс
@StealthRabbi Во время этого «ответа» и в течение некоторого времени после этого это была хорошая информация для кого-то, кто пытается работать с OSGi в дикой природе. OSGi уже участвовал в обсуждении, поэтому не было необходимости его определять. Это ответ в том, что он мог бы спасти людей неделю работы - вот и вся причина SO.
Шон Андерсон
9

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

Steen
источник
3

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

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

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

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