OSGI создает модульное веб-приложение - PullRequest
9 голосов
/ 01 сентября 2011

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

Теперь выгода в том, что я хочу, чтобы мое веб-приложение было как можно более универсальным, не полагаясь на веб-контейнер j2ee для поддержки чего-либо.То есть я не могу полагаться на свой веб-контейнер для обеспечения поддержки OSGI и развертывания веб-приложения в виде самого пакета OSGI (который действительно делает вещи очень простыми, например, Glassfish и WAS).

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

Для меня было бы замечательно, если бы мое веб-приложение было также в комплекте.Есть ли что-нибудь близкое к этому идеальному решению, которое я могу попробовать?Или какой-либо другой способ связи между двумя терминами osgi и веб-приложением (контейнером)?

Ответы [ 4 ]

5 голосов
/ 01 сентября 2011

Спецификация OSGi описывает формат WAB (Web Archive Bundle).

и Pax Web предлагает отличную поддержку веб-приложений WAB / WAR (PAX Web отлично работает на Equinox, Felix и т. Д.)

Используя pax web, вы получаете BundleContext через ServletContext, например:

BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");

Для пользовательской возможности подключения, о которой вы упомянули, я предложил вам предоставить некоторые сервисные интерфейсы для реализации пакетов плагинов, и в вашем веб-приложении используйте ServiceTracker для прослушивания их регистрации (если вы не используете Декларативные услуги). Вы также легко сможете установить пакеты из сервлета загрузки.

Я предполагаю, что пользователи, загружающие плагины, должны будут войти в систему и авторизоваться, поэтому на этом этапе проблемы безопасности будут встречаться.


РЕДАКТИРОВАТЬ: ответ на комментарий здесь, поскольку недостаточно места в поле для комментариев

Извините, подумайте, что я неверно истолковал ваш вопрос - у вас есть контейнер (ы) веб-приложений, и вы хотите развернуть WAR с функциональностью OSGi? Если это так, то либо используйте ServletBridge, как уже упоминали другие, либо внедрите каркас OSGi в вашу WAR (это относительно просто, см., Например, this ).

Вы могли бы даже сделать это необязательным, пытаясь получить BundleContext от ServletContext и, если он возвращает null, запустить собственный встроенный фреймворк. Таким образом, он будет работать в собственном контейнере OSGi (например, Glassfish) или на сервере приложений Java EE.

В противном случае PaxWeb представляет собой реализацию спецификаций OSGi HttpService и WebApp, но с множеством расширений, облегчающих жизнь - но вы развертываете это в контейнере OSGi.

2 голосов
/ 01 сентября 2011

Возможно, вы захотите взглянуть на Apache Sling .Это веб-фреймворк со встроенным контейнером OSGiКонтейнер OSGi называется Apache Felix и довольно хорош.

1 голос
/ 02 сентября 2011

Вы можете попробовать ChonCMS - http://www.choncms.com

Его архитектура основана именно на том, что вы просите, она поставляется с несколькими плагинами для обеспечения базовой функциональности CMS, это модульная платформа с небольшим контейнером веб-приложений, использующая felix, и плагины можно добавлять / удалять также во время выполнения.

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

1 голос
/ 01 сентября 2011

ServletBridge - для встраивания OSGI-константы в веб-контейнер. Другой вариант - встроить веб-контейнер (в виде пакета) в контейнер OSGI. Следующая статья содержит некоторые подробности о том, как этого добиться.

http://java.dzone.com/articles/osgi-and-embedded-jetty

...