Архив рубрики ‘OSGi’

OSGi. Pax Construct – импорт проекта в Idea

Июль 19, 2009

Итак, скелет проекта готов. Для дальнейшей разработки было бы очень желательно использовать какую-нибудь IDE. В нашем случае, как я и обещал, это будет Intellij Idea. В моем случае – версии 8.1. Итак, используем возможности Maven для генерации проекта для Idea – перейдем в корень проекта и выполним команду mvn idea:idea. После окончания ее выполнения в корне проекта должен появиться файл с расширением *.ipr, *.iws и *.iml – это значит, что проект успешно создан и его можно открывать в среде разработки.

Прежде чем открывать проект, удостоверьтесь, что в настройках правильно задана домашняя директория Maven или в PATH присутствует переменная M2_HOME с этим значением. В настройках Idea это можно задать следующим образом: Settings -> Maven, и в открывшемся диалоге задать соответствующие значения:

Maven home directory

В моем случае это /opt/maven. Итак, можно импортировать проект: File->Open Project. Выбираем директорию с нашим проектом, открываем файл %projectname%.ipr. После этого открываем вкладку обзора проекта и видим там примерно следующую картину:

Project structure

Для каждой директории, содержащей pom.xml был создан модуль проекта Idea, в том числе и для нашего бандла. Теперь импортируем все pom.xml, чтобы получить возможность воспользоваться поддержкой Maven в Idea. Для этого нужно всего лишь перейти на закладку Maven Projects и выполнить импорт зависимостей Maven. Для этого нажмите на кнопку с плюсиком и выберите pom.xml в корне проекта. После этого закладка Maven Projects будет выглядеть примерно так:

Maven structure

Теперь можно выполнять  команды Pax Construct из этой закладки. Например, можно попробовать запустить pax-provision:

pax-prov

В консоли будет выведен следующий результат:

console

Как видно, OSGi-контейнер успешно стартовал, а наш бандл был в него инсталлирован и запущен. Теперь поговорим о добавлении новых модулей в проект. Лучше всего это делать так – вначале создать вручную сам бандл (аналогично тому, как мы создали бандл domain), а затем импортировать его через закладку Maven Projects – для этого нужно всего-лишь нажать кнопку Re-import Maven Projects в соответствующей закладке. Эта кнопка крайняя слева. После этого в закладках Project и Maven Projects появится новый модуль. Выполнив для него команду install, можно запустить опять pax-provision и убедиться, что новый модуль был собран и запущен в OSGi-контейнере. Обе команды мы конечно выполняем из закладки Maven Projects в Idea. На этом первое знакомство с Pax Construct можно считать законченным.

OSGi. Pax Construct – добавляем бандл

Июль 19, 2009

Итак, приступим к изменениям в структуре проекта. Прежде всего, я хочу поменять используемый 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-контейнер. Продолжение следует.

OSGi. Pax Construct – создаем проект

Июль 18, 2009

Так уж сложилось, что в основном для разработки OSGi-приложений в подавляющем большинстве случаев используется Eclipse. Моей же любимой IDE является Intellij Idea. Что же она может нам предложить? Прежде всего, очень хорошую интеграцию с Maven. Казалось бы, напрямую с OSGi это никак не связано. Однако, есть один основанный на Maven, проект, который еще называют “швейцарский нож OSGi-разработчика”. Имя ему Pax Construct. А так как в Idea поддерживается полный набор Maven-архетипов Pax Construct, то можно использовать их для создания проекта и модулей, получив вместе с новосозданным проектом в свое распоряжение весь арсенал этой библиотеки скриптов (чем она и является).

Прежде, чем приступать к использованию  Pax Construct в Idea, познакомимся с ним в отдельности. Надеюсь, цикл статей об OSGi, приведенный в первой заметке, Вы прочитали и с тем, что такое OSGi-контейнер, бандлы и их жизненный цикл, знакомы. Теперь попробуем установить Pax Construct и познакомиться с его возможностями.

Скачать скрипты можно отсюда. Затем их следует распаковать в %location% и директорию %location%/bin занести в PATH системы. Также должен быть установлен Maven. Без него ничего работать не будет, так как Pax Construct вовсю использует его возможности.

Рассмотрим, какие скрипты есть в поставке и что они делают:
pax-add-repository – добавляет репозиторий Maven в список репозиториев проекта;
pax-clone – клонирует существующий проект Pax Construct;
pax-create-bundle – создает новый бандл в пределах модуля или проекта;
pax-create-module – создает новый модуль в пределах другого модуля или проекта. Здесь модуль – это логическая сущность для группировки бандлов;
pax-create-project – создает новый родительский OSGi-проект. Как правило, этот скрипт Вы используете самым первым. Внутри созданного проекта можно будет создать бандлы или модули;
pax-embed-jar – внедряет jar в бандл OSGi. После этого внедренный jar доступен в classpath бандла;
pax-import-bundle – добавляет в манифест бандла инструкции Import-Package для импортирования зависимостей в бандл;
pax-move-bundle – перемещает бандл в новую директорию, внося изменения в соответсвующие pom-файлы;
pax-provision – запускает OSGi-контейнер (по умолчанию – Apache Felix), устанавливает в него все бандлы с зависимостями и стартует их;
pax-update – производит обновление Pax Construct;
pax-wrap-jar – создает бандл в рамках OSGi-проекта или модуля, в который оборачивается jar. Проще говоря, превращает jar в OSGi-бандл.

Теперь попробуем создать новый проект. В командной строке выполним команду:

ynov@ynov-laptop:~/IdeaProjects$ pax-create-project

pax-create-project -g groupId -a artifactId [-v version] [-o] [-- mvnOpts ...]

groupId (examples) ? com.ynov
artifactId (myProject) ? OsgiExample
version (1.0-SNAPSHOT) ?

[INFO] Scanning for projects…
[INFO] Archetype created in dir: /home/ynov/IdeaProjects/OsgiExample

[INFO] ————————————————————————
[INFO] BUILD SUCCESSFUL
[INFO] ————————————————————————

Если запустить команду без аргументов, то придется ответить на вопросы скрипта и ввести groupId, artifactId, version, которые будут использованы в pom файлах Maven. Итак, pax-create-project создал нам начальную структуру проекта, которая выглядит вот так:

Структура проекта

Как видно, в структуре проекта есть несколько pom-файлов Maven. Сейчас нас интересует тот, что лежит в корне – именно он отвечает за сборку всего проекта. Тот pom.xml, который лежит в директории poms, нам понадобится чуть позже. Он будет служить родительским pom.xml для бандлов, которые мы создадим. А в директории provision лежит pom.xml, который будет использоваться скриптом pax-provision для принятия решения, какие бандлы следует инсталлировать в OSGi-контейнер при его запуске. Запустим теперь pax-provision. Этот скрипт запустит OSGi-контейнер, а если бы у нас в проекте были бандлы, то они были бы туда установлены. Итак:

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] ————————————————————————
[INFO] Building com.ynov.OsgiExample (OSGi project)
[INFO] task-segment: [org.ops4j:maven-pax-plugin:1.4:provision] (aggregator-style)
[INFO] ————————————————————————

Welcome to Felix.
=================

->

Символ “->” означает приглашение командной строки OSGi-контейнера Felix, который запускается по умолчанию. В следующей статье мы попробуем модифицировать проект под свои нужды.

OSGi. Введение

Июль 18, 2009

OSGi (Open Services Gateway Initiative) – спецификация динамической плагинной (модульной) шины для создания Java-приложений, разрабатываемая консорциумом OSGi Alliance.

Наверное, мало кто будет спорить с тем, что хорошо разработанное приложение должно иметь модульную структуру. Подобная архитектура позволяет получить максимальную гибкость, обеспечить возможность переиспользования модулей, облегчить поддержку и модификацию системы в будущем. Как правило, для разработки модульной структуры приложения используются такие широко известные практики, как разделение классов на пакеты по функциональному признаку, разделение системы на функциональные слои (классика жанра – паттерн MVC), обеспечение низкой связности между классами при помощи интерфейсов. Вероятно, с этой же целью используется внедрение зависимостей при помощи весьма популярного фреймворка Spring, чтобы можно было на декларативном уровне определять зависимости между классами, а так же разбиение проекта на несколько подпроектов, каждый из которых собирается индивидуально. Однако, в итоге все приложение все равно разворачивается на сервере в виде одного большого WAR-архива.

Стандарт OSGi призван привнести недостающую поддержку модульности в Java. Этому стандарту уже посвящено некоторое количество статей в интернете, поэтому для ознакомления с темой я могу порекомендовать этот цикл.


Follow

Get every new post delivered to your Inbox.