Самый простой способ разработки приложений OSGi на основе Spring — это использование SpringSource Tools (плагин Eclipse) и SpringSource dm Server combo. Они обеспечивают быструю разработку, такую как проверка MANIFEST.MF, удобное развертывание и автоматическая загрузка необходимых (и OSGi-ориентированных) библиотек. Позже, когда вам нужно перейти на обычный OSGi (как и я), вы можете следовать этой серии руководств.
Месяц назад я начал разработку приложения с использованием SpringSource dm Server (ssdms) . В середине проекта возникли опасения по поводу его развертывания в «простом» контейнере OSGi (а именно в Equinox ). Миграция была непростой, поэтому я решил опубликовать ее в блоге, чтобы поделиться.
Сначала я скачал голую «Рамку» из Eclipse . Версия «Eclipse Equinox» (в списке самых верхних) — это Framework +, но я не использовал ее, так как хотел собрать все с нуля (и он наполнен старыми Servlet 2.4 и Jetty 5).
Фреймворк представляет собой jar-файл <1 МБ, запускаемый с помощью «java -jar JARNAME.JAR -console». Это было не очень интересно, поэтому следуя инструкциям в Руководстве по быстрому запуску (потратьте некоторое время на чтение последнего раздела, оно того стоит), я загрузил собственный пусковой механизм для моего Mac с той же страницы загрузки.
Примечание для пользователей Mac: поскольку это тот же модуль запуска, который используется в Eclipse IDE, он не работает в 64-разрядной версии Java 6. Также не делает версию Какао.
Проверьте структуру, запустив ее. В консоли osgi> введите ss. Он покажет один активный пакет (который является самой структурой). Типа близко к выключению.
osgi> ss Framework is launched. id State Bundle 0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
Если вы хотите включить JMX, откройте eclipse.ini (он находится в Eclipse.app, если вы используете Mac) и добавьте следующие записи:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6789 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Запустите jconsole из терминала или командной строки (при условии, что в вашем пути указан JDK / bin) и введите service: jmx: rmi: /// jndi / rmi: // localhost: 6789 / jmxrmi в URL JMX. Вы должны увидеть «внутри» фреймворка:
Следующий шаг — заполнить его библиотеками. Самый простой способ — скопировать из дистрибутива ssdms наши эквиноксы / плагины:
- Каждая банка в / lib, КРОМЕ :
- Банки начались с com.springsource.server
- Банки с slf4j, если вы хотите «унифицированную» регистрацию, как я (объясню позже)
- Jars начались с org.eclipse.osgi, потому что они могут конфликтовать с нашей средой OSGi
- Каждый jar в / репозиторий / bundles / ext ИСКЛЮЧИТЬ :
- Банки, имеющие slf4j и все, что связано с любой структурой журналирования (commons-logging, Log4J), если вы хотите «унифицированную» регистрацию
- Банки, имеющие -sources, если вы не хотите сохранить исходный код
- Jars начали с org.springframework.osgi, потому что мы будем использовать те из дистрибутива Spring Dynamic Modules
- Каждый jar в / репозиторий / bundles / usr ИСКЛЮЧИТ :
- Банки, имеющие slf4j и все, что связано с любой структурой журналирования (commons-logging, Log4J), если вы хотите «унифицированную» регистрацию
- Банки, имеющие -sources, если вы не хотите сохранить исходный код
Что такое «унифицированная» регистрация? Ну, вы можете захотеть объединить ваши средства ведения журнала, чтобы быть таким:
По сути все идет в одну раковину, облегчая администрирование. В любом случае регистрация заслуживает отдельной записи в блоге, поэтому я пропущу ее сейчас. Давайте загрузим Spring Dynamic Modules и скопируем следующие файлы jar из / dist в наши плагины / Equinox:
- весна-OSGi-ядро-VERSION.jar
- весна-OSGi-расширитель-VERSION.jar
- весна-OSGi-ю-VERSION.jar
- весна-OSGi-веб-VERSION.jar
- весна-OSGi-веб-расширитель-VERSION.jar
Примечание. На данный момент вы можете использовать (скачать и поместить в / plugins) любую библиотеку каркаса журналов по вашему выбору. Позже, когда вы решите использовать унифицированный подход, вы должны заменить их мостами SLF4J.
Вы определенно захотите, чтобы динамические модули Tomcat и Spring работали каждый раз, когда запускается фреймворк. Вы можете перейти к консоли и запустить их вручную (платформа запоминает последние активные пакеты при завершении работы и запустит их при следующем запуске), или вы можете перечислить их в /configuration/config.ini. Последнее предпочтительнее, так как вы можете «сбросить» каркас (удалить всю конфигурацию и кеш) и при этом запустить нужные пакеты при запуске. Для этого поместите следующую запись:
osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start,
catalina.start.osgi-VERSION.jar@3:start, spring-osgi-extender-VERSION.jar@4:start,
spring-osgi-web-extender-VERSION.jar@4:start
eclipse.ignoreApp=true
osgi.noShutdown=true
Проверьте нашу конфигурацию, снова запустив фреймворк. Вы должны увидеть журналы активности Tomcat и Spring Dynamic Modules. Более или менее вы должны увидеть что-то вроде этого:
14:48 Start Thread I o.s.o.w.t.i.Activator - Starting Apache Tomcat/6.0.18 ... 14:48 Start Thread I o.s.o.w.t.i.Activator - Using default XML configuration bundleresource://3/conf/default-server.xml Mar 11, 2009 2:48:09 PM org.apache.catalina.startup.ClusterRuleSetFactory getClusterRuleSet INFO: Unable to find a cluster rule set in the classpath. Will load the default rule set. 14:48 t Dispatcher I o.s.o.e.i.a.ContextLoaderListener - Starting [org.springframework.osgi.extender] bundle v.[1.2.0.m2] Mar 11, 2009 2:48:09 PM org.apache.coyote.http11.Http11AprProtocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 Mar 11, 2009 2:48:09 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 227 ms Mar 11, 2009 2:48:09 PM org.apache.catalina.core.StandardService start INFO: Starting service Catalina Mar 11, 2009 2:48:09 PM org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.18 Mar 11, 2009 2:48:09 PM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-8080 14:48 Start Thread I o.s.o.w.t.i.Activator - Succesfully started Apache Tomcat/6.0.18 @ Catalina:8080 14:48 Start Thread I o.s.o.w.t.i.Activator - Published Apache Tomcat/6.0.18 as an OSGi service 14:48 t Dispatcher I o.s.o.e.i.s.ExtenderConfiguration - No custom extender configuration detected; using defaults... 14:48 t Dispatcher I o.s.s.t.TimerTaskExecutor - Initializing Timer 14:48 t Dispatcher I o.s.s.t.TimerTaskExecutor - Initializing Timer 14:48 t Dispatcher I o.s.o.w.e.i.a.WarLoaderListener - Starting [org.springframework.osgi.web.extender] bundle v.[1.2.0.m2] 14:48 xtender-Init I o.s.o.w.e.i.a.WarListenerConfiguration - No custom extender configuration detected; using defaults... 14:48 xtender-Init I o.s.o.w.d.t.TomcatWarDeployer - No Catalina Service set; looking for one in the OSGi service registry... 14:48 xtender-Init I o.s.o.w.d.t.TomcatWarDeployer - Found service Catalina
Вот и все, позже я напишу о том, как заставить EclipseLink JPA работать (динамически!) И интегрировать BlazeDS для Flex Remoting.