Лучший способ построить систему плагинов с Java
Как бы вы реализовали плагин-систему для вашего Java-приложения?
можно ли иметь простую в использовании (для разработчика) систему, которая обеспечивает следующее:
- пользователи помещают свои плагины в подкаталог приложения
- плагин может обеспечить экран конфигурации
- если вы используете фреймворк, совместима ли лицензия с коммерческой разработкой?
8 ответов:
сначала вам нужен интерфейс, который все плагины должны реализовать, например
public interface Plugin { public void load(PluginConfiguration pluginConfiguration); public void run(); public void unload(); public JComponent getConfigurationPage(); }авторы плагинов должны затем объединить свои плагины в файлы JAR. Ваши приложения открывают файл JAR, а затем могут использовать атрибут из манифеста JAR или список всех файлов в файле JAR, чтобы найти класс, который реализует ваш интерфейс плагина. Экземпляр этого класса, плагин готов к работе.
конечно, вы также можете реализовать какой-то песочницы, так что плагин ограничен в том, что он может и не может делать. Я создал небольшой тест приложения (и написал об этом в блоге), который состоит из двух плагинов, один из которых запрещен доступ к локальным ресурсам.
использовать OSGi.
Это основа системы плагинов Eclipse. Эквинокс это реализация Eclipse (лицензионный EPL) и Феликс это реализация проекта Apache (Лицензия Apache Public License).
Eclipse предоставляет конкретный пример того, что OSGi может охватывать точки, которые вы упомянули (или вы можете просто построить свое приложение поверх Eclipse RCP Если вы хотите полный стек Eclipse/SWT/JFace).
с 1.6, там было java.утиль.ServiceLoader который можно использовать, если вы хотите закодировать свою собственную простую систему.
но если вы хотите что-то большее, чем основные функции, используйте один из существующих фреймворков.
есть еще JPF (Java Plugin Framework).
Я работал над OSGi в течение недели-интенсивный, ничего, кроме недели OSGi. В конце концов, это было похоже на дурной сон, но я многому научился.
мне удалось заставить OSGi работать (не просто, все примеры устарели, все в сети по крайней мере три года, если не пять), но у меня были серьезные проблемы с его интеграцией в существующий проект из-за проблем с jar-манифестами.
короче говоря, есть только несколько неясных инструментов, используемых для построения манифестов и они не очень хорошо документированы (BND Tools вряд ли неясен, но он предназначен для определенного процесса в Eclipse). Кроме того, большая часть доступной информации OSGi не предназначена для разработчиков приложений, у которых есть существующее настольное приложение.
Это делает много контекста для информации туманной или неуместной. Сообщения в блоге Нила Бартлетта были самой большой помощью, но даже те не смогли получить рабочую систему (я схватил некоторый код из учебника Феликса и собрал его вместе, чтобы получить встроенный каркас прокатки). Я нашел его проект Книги, который он опубликовал бесплатно несколько лет назад, что отлично, но примеры в Eclipse не работают из-за изменений в поддержке Eclipse OSGi.
каждый шаг является серьезным препятствием. Я постараюсь опубликовать некоторые подробности здесь позже.
Я думаю, что рекомендация OSGi для решения вышеуказанной проблемы является чрезвычайно плохим советом. OSGi-это "правильный выбор", но для сценария, как указано выше, я думаю, что достаточно либо JPF, либо какой-то доморощенной минималистичной структуры.
используйте PF4J. Он имеет поддержку для паутины, Весны и калитки. Простота в использовании и создании приложений
лет назад я начал такой проект, и я надеюсь, что скоро будет готов.Я был вдохновлен такими проектами, как NetBeans и Eclipse, но тем временем он изменился на что-то немного другое. OSGi выглядит как хороший выбор сейчас, но у меня не было возможности сравнить его с моим project.It аналогичен с JPF, упомянутым выше, но в то же время отличается во многих отношениях.
основная идея, которая мотивировала меня, чтобы быть как можно проще построить приложение Java, без разделения между веб-приложениями, настольными приложениями или приложениями applet/JWS(конечно, это еще не охватывает пользовательский интерфейс) в качестве основной функциональности.
Я построил проект с несколькими целями в моем уме:
- это не имеет значения, если вы создаете веб-приложение или настольное приложение вы должны запустить приложение таким же образом, простой основной метод, не фантазии веб.xml-декларация(не то, чтобы я против наличия стандартного веб-дескриптора, но это не очень хорошо сочетается с plug-in system, где вы добавляете "сервлеты" - я называю их RequestHandler(s) - dynamic по вашему желанию).
- легко подключить " расширения "вокруг" точки расширения " - что-то из Eclipse, но другой подход.
- саморазвертывающийся, так как все плагины зарегистрированы(XML-файлы) приложение должно быть саморазвертывающимся независимо от системы сборки - конечно, есть задача Ant и Maven MOJO, которые являются связями с миром ourside, но в конце концов он вызывает приложение и поручить ему самостоятельно развернуть себя в определенном месте.
- заимствованный из Maven, он может загружать код из репозиториев (включая репозитории Maven 1 & 2), поэтому ваше приложение может быть развернуто как одна небольшая банка, пока у вас есть доступ к репозиториям (полезно когда-нибудь, и в основном это обеспечивает поддержку автоматических обновлений - вам не нравится идея получать уведомления от вашего веб-приложения о том, что есть более новая версия, она была загружена, и ей просто нужна ваша разрешение на его установку? Я знаю, что мне это нравится).
- основной мониторинг приложений о работоспособности системы, уведомления по электронной почте в случае сбоев
Comments