Статьи

Встраивание OSGi в Tomcat

Мой последний пост встраивал OSGi в сервер приложений, используя Felix , Jetty и PAX WEB . Здесь я собираюсь встроить Равноденствие в Tomcat . Я изначально намеревался встраивать Felix в Tomcat, но недостаток инструментов и каркасов, доступных для встраивания Felix, сделал использование Equinox намного проще.

Я использую слово «много» довольно свободно, хотя, потому что были некоторые обручи, через которые мне пришлось прыгать, чтобы компиляция JSP работала. Конечно, PAX WEB предоставил такую ​​возможность при встраивании Jetty в Felix. К сожалению, ни одна инфраструктура не предложила эти возможности в этом сценарии внедрения. По крайней мере, я не смог их найти.

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

Начиная

В духе использования самых простых возможных инструментов для этого примера вам понадобятся только Tomcat , Ant и Subversion . Если вы прошли предыдущий пример , у вас уже установлены Ant и Subversion. Если у вас уже есть Tomcat, вы должны быть настроены. Но если нет, загрузите Tomcat 6 , версию, которую я использовал для этого упражнения по встраиванию.

Оформить заказ HelloWorldEmbedJSP

Далее вам нужно оформить заказ из моего репозитория кода Google . При извлечении вы можете поместить проект в любое место, но вам необходимо убедиться, что вы знаете путь относительно каждого каталога, чтобы вы могли установить необходимые пакеты. У меня есть проект, который находится в каталоге рядом с Tomcat. Чтобы оформить заказ, откройте окно терминала или приглашение DOS и выполните следующие действия:

svn checkout
http://kcode.googlecode.com/svn/trunk/osgi/HelloWorldEmbedWebJSP

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

Создайте веб-приложение

Этот шаг не имеет ничего общего с OSGi. Но в качестве основы для сравнения я подумал, что было бы интересно упаковать образец в виде веб-приложения. Поскольку это точно такой же пример, который я использовал при встраивании Jetty в Felix , он предлагает хорошую основу для сравнения того, как мы можем развернуть эту функциональность различными способами. Чтобы создать веб-приложение, просто перейдите к веб-каталогу в консоли и введите следующее:

ant

Скрипт сборки выкладывает файл web.war в каталог bin. Просто возьмите этот web.war и скопируйте его в каталог веб-приложений Tomcat. Если вы еще не запустили Tomcat, сделайте это сейчас. Просто запустите другое приглашение DOS или окно консоли, перейдите в каталог bin Tomcat и выполните startup.bat или startup.sh. Как только это будет сделано, дайте ему секунду, чтобы взорвать веб-приложение и перейдите по адресу http: // localhost: 8080 / web / hi . Как я уже сказал, если вы выполнили упражнение в моем предыдущем посте по встраиванию Jetty в Felix, вы увидите то же самое здесь, развернутое как веб-приложение вместо пакета. На OSGi.

Мост

Веб-приложение Bridge.war является основной причиной, по которой я выбрал Equinox вместо Felix. Он предоставляет две очень важные функции, которые важны при встраивании OSGi в контейнер приложения. Фактически, это один из пунктов, о котором я буду говорить в следующем посте — насколько сложно использовать OSGi с серверами приложений текущего поколения. Это практически запрещено. Во всяком случае, вот две необходимые функции, предоставляемые мостом.

  • Встраивает и запускает Равноденствие
  • Туннельные запросы сервлетов от Tomcat к Equinox

Развертывание Bridge легко, потому что это веб-приложение. Просто возьмите Bridge.war из каталога web / lib проекта HelloWorldEmbedWebJSP и поместите его в каталог веб-приложений Tomcat. Дайте Tomcat секунду, чтобы взорвать веб-приложение, и протестируйте его, зайдя по адресу http: // localhost: 8080 / bridge / sp_test . Вы должны увидеть страницу, которая сообщает, что Servlet Delegate зарегистрирован. Теперь у вас есть встроенная OSGi в Tomcat с мостом, который будет передавать запросы в Tomcat и передавать их в Equinox.

Пользователи Linux и Mac OS / X принимают это к сведению. Как вы помните из предыдущих примеров, мы устанавливаем пакеты OSGi из консоли OSGi после запуска OSGi. Ну, так как мы встроили OSGi в Tomcat, где консоль? Консоль — это то же самое окно консоли, которое вы использовали для запуска Tomcat. Но поскольку Tomcat перенаправляет весь вывод в файл, вы можете его не увидеть. Чтобы включить консоль, вам нужно внести некоторые изменения в файл catalina.sh в каталоге bin Tomcat. У пользователей Windows не должно быть этой проблемы, хотя я уверен, что пользователи Windows имеют дело со многими другими типами проблем. В любом случае, открыв catalina.sh, закомментируйте следующую строку, чтобы она выглядела следующим образом. Если у вас есть тот же catalina.sh, что и у меня, в комплекте с Tomcat 6, это номер строки 298.

#>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

Теперь перезапустите Tomcat и вуаля … в консоли, которую вы использовали для запуска Tomcat, вы должны увидеть консоль OSGi. Введите ss, чтобы увидеть список установленных пакетов. Вперед!

Конфигурирование среды

Прежде чем мы развернем пакет, нам нужно настроить среду. Если бы мы не использовали JSP, мы бы сделали. Но поскольку JSP требуют компиляции, а JSP будут работать в Equinox, они не могут использовать компилятор JSP, включенный в Tomcat. Нам нужно включить наш собственный JSP-компилятор, и мы будем использовать Jasper . Я включил все необходимые пакеты в тот же каталог, где вы нашли Bridge.war. Чтобы установить пакеты, перейдите на консоль OSGi и выполните следующие действия:

osgi> install file:path to bundle/
javax.servlet.jsp_2.0.0.v200806031607.jar
osgi> install file:path to bundle/
org.apache.commons.el_1.0.0.v200806031608.jar
osgi> install file:path to bundle/
org.apache.commons.logging_1.0.4.v20080605-1930.jar
osgi> install file:path to bundle/
org.apache.jasper_5.5.17.v200806031609.jar
osgi> install file:path to bundle/
org.eclipse.equinox.jsp.jasper_1.0.100.v20080427-0830.jar
osgi> install file:path to bundle/
org.eclipse.equinox.jsp.jasper.registry_1.0.0.v20080427-0830.jar

Теперь введите ss, чтобы просмотреть состояние пакетов. Если они не активны, вам нужно запустить каждый из них. Опять же, в консоли OSGi просто введите:

osgi> start bundle id

В зависимости от зависимостей могут запускаться несколько пакетов. Просто сделайте ss между каждым запуском, чтобы увидеть, какие еще не запущены. Вымойте, промойте, повторите!

Построить и развернуть комплект

В отличие от моего предыдущего примера, в котором я дал вам предварительно сконфигурированную среду, в которой вам не нужно ничего создавать, мы должны выполнить сборку и развертывание пакета самостоятельно. Почему я это сделал? Только потому, что у Tomcat больше места, чем у Феликса и Джетти, и я не хотел помещать Tomcat в свой репозиторий кода Google. Здание довольно легко, хотя. Мы уже создали и развернули веб-приложение. Сборка комплекта выполняется аналогично, за исключением того, что мы будем использовать другой скрипт сборки Ant. Для этого шага вы можете либо закрыть Tomcat, либо открыть другое окно DOS или терминала. Перейдите в каталог HelloWorldEmbedWebJSP / web и введите следующее:

ant -f buildjar.xml

Файл JAR перезаписывает файл web.war в каталоге bin и размещает для вас действительный пакет OSGi с именем web.jar. Чтобы установить пакет, убедитесь, что Tomcat запущен, и введите в консоли OSGi следующее:

install file:relative path to web.jar/web.jar

Пакет будет установлен. Запустите его с помощью команды запуска OSGi. Теперь мы можем получить доступ к веб-приложению с поддержкой OSGi, перейдя по адресу http: // localhost: 8080 / bridge / hi . Опять же, это та же функциональность, что и у других веб-приложений, которые мы развернули, за исключением использования другой топологии развертывания.

Для выключения просто введите close в консоли OSGi. Были сделаны. Если у вас возникли проблемы, дайте мне знать через комментарии здесь или связавшись со мной . Далее … некоторые общие замечания по OSGi и, надеюсь, возиться с Distributed OSGi .

Дополнительные примечания

Несколько дополнительных заметок об этом упражнении. Очевидно, это оказалось немного сложнее, чем встраивать Jetty в Felix. Но если бы не среда PAX WEB, это упражнение оказалось бы одинаково трудным. Кроме того, Bridge.war выполняет для нас две очень важные функции. У Феликса есть подтверждающая документация, которая показывает, как встраивать Феликс , но я не нашел никакой инфраструктуры, которая бы сделала это для меня. Bridge.war был доступен, поэтому я использовал его. Но если бы мост был доступен для Феликса, было бы легко развернуть этот мост и установить web.jar с Феликсом, встроенным в Tomcat.

С http://techdistrict.kirkk.com