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

Asked
Viewd94757

145

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

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

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

8 ответов

107

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

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

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

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

  • Sandboxing isn’t that difficult. Took me about two weeks to find out how to do it correctly but once you know that it’s pretty simple. :)

    Bombe23 января 2009, 07:46
  • the sandbox you mention is actually the most difficult part! but not to fret - osgi already does it for you as mentioned above.

    Chii22 января 2009, 02:03
16

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

  • Has anyone here used JPF? Sounds interesting

    Sven Lilienthal21 января 2009, 15:48
9

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

30

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

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

41

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

Это основа системы подключаемых модулей Eclipse. Equinox - это реализация Eclipse (с лицензией EPL) и Felix - это реализация проекта Apache (под лицензией Apache Public License).

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

  • I’ve embedded equinox into my application and used standard OSGi practices to do exactly what the OP wants. In swing too, not SWT. Webstarted as well.

    good starting resource: http://neilbartlett.name/blog/

    basszero21 января 2009, 14:42
  • OSGi - идеальная система плагинов де-факто. Однако скачок от стандартной модели программирования Java к модели программирования OSGi довольно велик…

    Hendy Irawan17 июля 2010, 12:40
  • Я пробовал работать с OSGi, но так и не нашел по-настоящему хорошего учебника для начинающих. Было бы здорово, если бы кто-нибудь мог порекомендовать здесь несколько ссылок.

    Brian Matthews21 января 2009, 14:30
3

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

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

Я создал проект, имея в виду несколько целей:

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