понедельник, 24 января 2011 г.

Eclipse RCP: Понятие "возможности" (feature) в Eclipse RCP


Одним из важных понятий платформы Eclipse является понятие "возможности" (feature). Под возможностью понимается логическая группа бандлов, которые рассматриваются как единое целое. Важность понятия "возможность" проистекает из того факта, что механизм обновления и инсталяции программного обеспечения, применяемый в платформе Eclipse, - Eclipse Equinox p2 - позволяет выбирать для установки/обновления только возможности.


Строго говоря, общепринятого перевода данного термина на русский язык не существует, поэтому здесь и далее будет употребляться слово "возможность". Если у вас есть другое мнение по данному вопросу - добро пожаловать в комментарии.


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

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

На примере Eclipse Communication Framework можно сказать, что его более чем 120 бандлов разделены на 19 возможностей.



Создание возможностей в Eclipse PDE


Прежде чем рассматривать вопрос использование возможностей, необходимо научиться их создавать. В состав Eclipse PDE входит мастер создания возможностей, доступный из пункта меню New... -> Project... -> Plug-in Development -> Feature Project.



На первой странице мастера необходимо задать название проекта, идентификатор возможности, название возможности, предназначенное для чтения человеком, версию и, при необходимости, информацию о разработчике.



Если на данном шаге нажать кнопку Finish, то будет создана пустая возможность. При нажатии же кнопки Next станет доступна вторая страница мастера. Данная страница предназначена для выбора бандлов, которые будут включены в возможность. Набор бандлов можно взять как из существующей конфигурации запуска - отметив вариант Initialize from a launch configuration, так и непосредственно задать, выбирая те или иные плагины (вариант Initialize from the plug-ins list).



После нажатия кнопки Finish возможность будет создана и добавлена в список проектов рабочей области.



Видно, что по-умолчанию возможность состоит из двух файлов:
- feature.xml - основной файл возможности, содержит ее описание. Редактироваться может как вручную, так и с помощью специального мастера, входящего в состав PDE.
- build.properties - содержит настройки сборки возможности, в частности - список файлов, которые будут включены в состав результата сборки.

Так же в статье Сервлеты и OSGi: Equinox в сервлет-контейнере. Equinox Servletbridge был приведен пример возможности, содержащей каталог rootfiles. Содержимое данного каталога при экспорте будет выгружено в корень возможности.

Редактор возможности, служащий для модификации файлов feature.xml и build.properties, содержит девять вкладок, предназначенных для редактирования:

- Overview - основной информации о возможности,

- Information - описания возможности,

- Plug-ins - списка плагинов, включенных в возможность

- Included Features - списка других возможностей, поставляемых вместе с данной,

- Dependencies - списка плагинов, которые не поставляются с данной возможностью, но которые необходимы для ее корректной работы,

- Installation - параметров установки возможности в систему,

- Build - настройки сборки возможности, сохраняются в файле build.properties,

- feature.xml - исходного кода файла feature.xml,

- build.properties - исходного кода файла build.properties.

Рассмотрим некоторые из данных вкладок подробнее.

Overview



Предназначена для редактирования общей информации о возможности, в частности той, что указывалась при ее - возможности - создании. Если возможность включает в себя бандлы, содержащие код для каких либо специфичный окружений (Операционная система/Оконная система/Архитектура процессора/Язык), то необходимо перечислить все эти окружения в блоке Supported Environments.

Блоки в правой части вкладки предназначены для быстрой навигации, экспорта (см. ниже) и публикации возможности.

Information



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

Plug-ins and Fragments



Предназначена для создания списка плагинов (бандлов) и фрагментов, из которых и будет состоять возможность (кнопка Add...). Если выбрать конкретный плагин из списка, то в блоках правой половины вкладки (Plug-in Details) можно указать специфичную для данного плагина информацию: версию, размер плагина при скачивании, размер пространства, нужного для его установки, распаковывать или нет данный плагин при установке, а также специфичные для плагина окружения (соответственно плагин будет устанавливаться только в данных окружениях), если это необходимо.

Кнопка Versions... позволяет выбрать алгоритм синхронизации версий плагинов при сборке возможности. Если нажать данную кнопку, то появится диалоговое окно выбора алгоритма:



Доступны следующие варианты (сверху-вниз)

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

2. Копировать версии из манифеста плагинов и фрагментов - актуальные версии будут подставлены после нажатия кнопки Finish.

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

Included features



Предназначена для создания списка возможностей, включаемых в создаваемую. Т.к. в любую возможность можно включать другие возможности, то можно строить деревья возможностей, практически неограниченной глубины. Если выбрать конкретную возможность из списка, то в блоках правой части вкладки - Included Feature Details можно задать информацию, специфичную для данной возможности: название и версию; признак опциональности - возможность будет устанавливаться только если она доступна; место, где искать патчи для данной возможности - апдейт-сайты и специфичные для возможности окружения (например win32/win32/x32), что необходимо, если данная возможность содержит код, специфичный для какой-либо платформы/набора платформ.

Dependencies



Предназначена для указания плагинов/возможностей, от которых зависит данная возможность. Возможна ситуация, когда для корректной работы возможности необходим набор плагинов, которые в саму возможность не входят. Данные плагины/возможности необходимо перечислить в блоке Required Features/Plug-ins.

Экспорт возможности

Следует отметить, что экспортом называется непосредственно процесс сборки возможности.

В правом верхнем углу каждой вкладки редактора возможности содержатся кнопки Export a deployable feature и Help. Рассмотрим подробнее процесс экспорта. После нажатия кнопки Export a deployable feature станет доступно диалоговое окно управления экспортом.



Блок Available Features позволяет выбрать предназначенные для экспорта возможности из присутствующих в рабочем пространстве. Ниже данного блока расположены вкладки, содержащие настройки экспорта:

Блок Destination позволяет выбрать путь экспорта, т.е. куда именно будет экспортирована возможность, готовая для установки: в каталог файловой системы, архив или сразу же загружена на апдейт-сайт.

Options позволяет указать общие параметры экспорта.



Флажок Export Source позволяет определить экспортировать ли исходники бандлов и, если экспортировать, то как: в отдельных бандлах или включать в состав экспортируемых бандлов.

Package as individual JAR archives... если данный флажок установлен, то каждый бандл будет экспортирован в отдельный архив. Так же, в случае, если данный флажок отмечен - становятся доступными другие флажки:

Generate metadata repository - генерировать ли репозиторий с метаданными. Данный репозиторий может использоваться в качестве источника для установки экспортируемой возможности с помощью Equinox p2. Если данный флажок отмечен, то становится доступным параметр Categorize repozitory - xml-файл, содержащий перечисление категорий для p2-репозитория. По-умолчанию, при установки нового ПО с помощью пользовательского интерфейса системы p2 (Help -> Install new software...) доступны только те возможности, которые включены хотя бы в одну категорию.

Qualifier replacement - заменять или нет параметр qualifier в номере версии актуальным значением.

Save as Ant script - позволяет автоматизировать процесс экспорта, создав Ant-файл. В дальнейшем вместо использования мастеров PDE можно будет использовать данный скрипт.

Allow for binary cycles in target platform - позволить ли целевой платформе содержать циклические зависимости.

Use class files compiled in the workspace - если данный флажок отмечен, то при экспорте не будет заново выполняться компиляция бандлов, а будут использоваться .class-файлы, уже созданные в PDE.

JAR Signing



Позволяет задать параметры подписи JAR-архивов при экспорте.

Java Web Start



Позволяет задать параметры создания JNLP манифеста для системы Java Web Start.

На этом описания процесса создания и экспорта возможностей можно считать законченным.

Брендирование возможностей


Так как возможность - это прежде всего маркетинговое понятие, то вполне разумно иметь механизм брендирования, т.е. снабжения возможности более полной информацией о создателе и предназначении, нежели значения параметров Name и Provider.

Механизм брендирования позволяет определить следующую информацию:

1. Изображение, отображаемое в стандартном окне About Eclipse RCP-приложений.



2. Описание, которое будет выводиться при выборе возможности во вкладке Features диалогового окна Installation Details стандартного окна About Eclipse RCP-приложений.



Следует отметить, что в данной вкладке перечисляются ТОЛЬКО БРЕНДИРОВАННЫЕ возможности.

Для брендирования возможности используется так называемый брендирующий бандл - это либо бандл, имеющий идентификатор (значение поля манифеста Bundle-SymbolicName) совпадающий с идентификатором возможности, либо указанный в качестве значения параметра Branding Plug-in возможности:



Брендирующая информация содержится в файле about.ini брендирующего бандла. Данный файл представляет собой обычный properties-файл, содержащий как минимум значения параметров aboutText и featureImage. В качестве значений можно использовать значения параметров, определенных в файле about.properties, например, в about.ini содержится:

aboutText=%blurb

В то время как в about.properties содержится:

blurb=Hyperbola Chat Client Product\n\
\n\
Version: {featureVersion}\n\
Build id: {0}\n\
\n\
(c) Copyright Jean-Michel Lemieux and Jeff McAffer. All rights reserved.\n\
Visit http://eclipsercp.org/hyperbola


Стоит отметить, что в тексте можно использовать макроподстановки, как системные - featureVersion, так и определяемые пользователем: 0. Значения макроподстановок, определяемых пользователем хранятся в файле about.mappings:

0=1.0.0

Чтобы параметры, начинающиеся на '%', корректно ресолвились, в манифесте бандла должно быть определено значение параметра Bundle-Localization, например:

Bundle-Localization: plugin.

Естественно, что файлы about.ini, about.mappings,about.properties и используемое изображение должны экспортироваться при сборке бандла, т.е. должны быть перечисленны в файле build.properties бандла.

Так же важно отметить, что в качестве человеко-читабельного названия брендированной возможности будет выводиться не значение параметра Name, а значение параметра Bundle-Name манифеста брендирующего бандла.

Eclipse RCP-приложение, основанное на возможностях


Если разрабатывается RCP приложение, в котором планируется использовать механизм p2 для установки/обновления ПО, то продукт такого приложения должен быть основан на возможностях.

Для этого необходимо выставить значение параметра The product configuration is based on в features:



После чего на вкладке Dependencies появится блок Features, в который можно добавлять возможности, из которых состоит приложение.



Очень важно! Если проект разрабатывался сначала как plugin-based, а затем конфигурация была изменена на features-based, необходимо очистить конфигурацию - удалить все содержимое блока Plug-ins вкладки Configuration:



Если этого не сделать, то будет сгенерирован файл config.ini, специфичный для plugin-based конфигурации, и при старте приложения возможности не будут инсталлироваться.

Ссылки


При написании статьи использовались следующие материалы:

- Книга Eclipse Rich Client Platform Second edition

- Eclipse Feature Project - Tutorial от Lars Vogel

- The Eclipse p2 update wiki

Пример созданной брендированной возможности можно скачать из репозитория автора на GitHub.

З.Ы. Есть ли смысл написать про управление возможностями с помощью p2?

Понравилось сообщение - подпишитесь на блог

6 комментариев:

Neopux комментирует...

а можете немного разъяснить про системные макроподстановки? не очень ясно, что значит
Version: {featureVersion}
и откуда берется значение featureVersion

Pavel Samolisov комментирует...

{featureVersion} - версия данной возможности - значение атрибута version тега feature файла feature.xml.

Полный список системных макроподстановок к сожалению не нашел.

Neopux комментирует...

а кто занимает подстановкой {featureVersion}. На каком этапе это происходит? Я просто смотрю код org.eclipse.ui.internal.ProductProperties где происходит загрузка маппинга, и вижу, что он подставляет только SystemProperties.

И еще вопрос у нас есть Appl.product в котором есть about.text кроме этого есть about.ini &about.properties & about.mapping. А еще в самом plugin.xml в product extension я могу указать about.text или сослаться на pligin.properties. Это дублирование? Или это разные about?

Pavel Samolisov комментирует...

Я не знаю, что конкретно занимается подстановкой значений внутри Eclipse, так глубоко я не копал.

plugin.properties - это свойство плагина, касающиеся только его. about.properties - свойства возможности, в которую входят плагины. Это разные about.text. В одном случае вы описываете плагин, а в другом - более высокоуровневую сущность: возможность.

Irina Barykina комментирует...

Спасибо за ответ :)

Alex Melnikov комментирует...

Обязательно напишите про p2, пожалуйста!

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!