Итак, приступим к изменениям в структуре проекта. Прежде всего, я хочу поменять используемый OSGi контейнер на Equinox. Для этого в корневом pom.xml заменим соответствующий блок конфигурации:
<groupId>org.ops4j</groupId>
<artifactId>maven-pax-plugin</artifactId>
<version>1.4</version>
<configuration>
<provision>
<param>--platform=equinox</param>
</provision>
</configuration>
По умолчанию там задан Felix, я заменяю контейнер на Equinox. Теперь можно создать свой первый OSGi-бандл. Для этого переходим в корневую директорию проекта и выполняем скрипт pax-create-bundle:
ynov@ynov-laptop:~/IdeaProjects/OsgiExample$ pax-create-bundle
pax-create-bundle -p package [-n bundleName] [-g bundleGroupId] [-v version] [-o] [-- mvnOpts ...]
package (org.example.pkg) ? com.ynov
bundleName () ? domain
bundleGroupId () ? com.ynov.domain
version (1.0-SNAPSHOT) ?
…
[INFO] Archetype created in dir: /home/blaze/IdeaProjects/OsgiExample/domain
[INFO] ————————————————————————
[INFO] BUILD SUCCESSFUL
[INFO] ————————————————————————
Запустив скрипт без параметров, отвечаем на его вопросы и задем начальный пакет, имя бандла, groupId и версию для Maven. После окончания работы скрипта в директории проекта появится новая директория с именем domain, которая и является проектом нашего бандла. Внутри нее можно найти такие интересные вещи:
pom.xml – содержит инструкции для Maven, как надо строить проект бандла. В качестве родительского используется корневой pom.xml проекта, в который уже добавлен рассматриваемый pom.xml бандла как дочерний;
osgi.bnd – Pax Construct использует также другой инструмент – BND, который используется для автоматической генерации файла манифеста для бандла. osgi.bnd содержит инструкции, как следует генерировать манифест;
src – папка для исходников. Содержит начальную структуру пакетов, которая была задана при выполнении скрипта, а также пару автоматически сгенерированных классов – интерфейс службы, ее реализацию и класс-активатор, который регистрирует ее в OSGi-контейнере.
Теперь перейдем в корень проекта. Выполним команду mvn install для сборки бандла и установки его в наш локальный .m2 репозиторий Maven:
ynov@ynov-laptop:~/IdeaProjects/OsgiExample$ mvn install
[INFO] Scanning for projects…
[INFO] Reactor build order:
[INFO] com.ynov.OsgiExample (OSGi project)
[INFO] OsgiExample – plugin configuration
[INFO] OsgiExample – wrapper instructions
[INFO] OsgiExample – bundle instructions
[INFO] OsgiExample – imported bundles
[INFO] com.ynov.domain [com.ynov]
[INFO] ————————————————————————
…
[INFO] ————————————————————————
[INFO] Reactor Summary:
[INFO] ————————————————————————
[INFO] com.ynov.OsgiExample (OSGi project) ………………. SUCCESS [4.149s]
[INFO] OsgiExample – plugin configuration ……………….. SUCCESS [0.049s]
[INFO] OsgiExample – wrapper instructions ……………….. SUCCESS [0.301s]
[INFO] OsgiExample – bundle instructions ………………… SUCCESS [0.043s]
[INFO] OsgiExample – imported bundles …………………… SUCCESS [0.041s]
[INFO] com.ynov.domain [com.ynov] ………………………. SUCCESS [13.520s]
[INFO] ————————————————————————
[INFO] ————————————————————————
[INFO] BUILD SUCCESSFUL
[INFO] ————————————————————————
Проект собрался успешно. Теперь запустим уже знакомый нам скрипт pax-provision. Теперь после его выполнения мы видим следующее:
ynov@ynov-laptop:~/IdeaProjects/OsgiExample$ pax-provision
[INFO] Scanning for projects…
[INFO] Reactor build order:
[INFO] com.ynov.OsgiExample (OSGi project)
[INFO] OsgiExample – plugin configuration
[INFO] OsgiExample – wrapper instructions
[INFO] OsgiExample – bundle instructions
[INFO] OsgiExample – imported bundles
[INFO] com.ynov.domain [com.ynov]
…
osgi> STARTING com.ynov
REGISTER com.ynov.ExampleService
Во-первых, поменялось приглашение OSGi-контейнера. Теперь оно выглядит как “osgi>“. Это приглашение Equinox, контейнера, который теперь используется вместо Felix, который был опцией по умолчанию. А еще pax-provision распознал наш новосозданный бандл и установил его в контейнер, после чего запустил и зарегистрировал сервис. Выполним в контейнере команду ss, которая покажет список всех бандлов, находящихся в контейнере на данный момент:
osgi>ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.5.0.v20090520
1 ACTIVE org.eclipse.osgi.util_3.2.0.v20090520-1800
2 ACTIVE org.eclipse.osgi.services_3.2.0.v20090520-1800
3 ACTIVE com.ynov.domain_1.0.0.SNAPSHOT
Бандл с id=3 и есть наш недавно созданный бандл. Как видно, он находится в активном состоянии. Можно посмотреть его детали при помощи команды bundle 3, где 3 – id бандла:
osgi> bundle 3
com.ynov.domain_1.0.0.SNAPSHOT [3]
Id=3, Status=ACTIVE Data Root=/home/ynov/IdeaProjects/OsgiExample/runner/equinox/org.eclipse.osgi/bundles/3/data
Registered Services
{com.ynov.ExampleService}={service.id=26}
No services in use.
Exported packages
com.ynov; version=”1.0.0.SNAPSHOT”[exported]
Imported packages
org.osgi.framework; version=”1.5.0″<org.eclipse.osgi_3.5.0.v20090520 [0]>
No fragment bundles
Named class space
com.ynov.domain; bundle-version=”1.0.0.SNAPSHOT”[provided]
No required bundles
Тут есть много интересной информации о бандле, включая и то, что тут указана и наша зарегистрированная служба, которую бандл предоставляет для использования. Выйти из контейнера можно посредством команды exit. Итак, мы уже умеем при помощи Pax Construct создавать проект, конфигурировать используемый OSGi-контейнер, создавать свой бандл внутри проекта, строить его и деплоить в OSGi-контейнер. Продолжение следует.