Проблема с «текущим» подходом (pre3.5M5, как и eclipse3.4) заключается в том, что как расширение плагинов Eclipse, так и OSGI DS (декларативные службы) действительно требуют наличия определенного специфичного для расширения или OSGI-специфичного API в ваш плагин.
Я бы посоветовал вам проверить это хорошее введение в декларативные услуги в этой презентации Powerpoint:
Компонентно-ориентированная разработка в OSGi с декларативными сервисами, Spring Dynamic Modules и Apache iPOJO , от EclipseCON2009.
Вот вкус:
Уровень модуля позволяет минимизировать статические зависимости, а меньшее количество статических зависимостей означает меньшее материал , который должен присутствовать для работы вашего компонента.
Службы позволяют вашему компоненту взаимодействовать с другими компонентами.
Компоненты должны быть реализованы как POJO (простые старые объекты Java) склеены вместе со службами OSGi.
Декларативные услуги (DS) - это спецификация OSGi Compendium, раздел 112.
Он был представлен в версии 4.0 и основан на модели расширителя.
Как и все расширители, DS выполняет задачи от имени других пакетов.
Спецификация DS определяет этот расширитель, и он реализуется фреймворками.
Сам комплект расширителей называется Run компонента службы или SCR.
Термины DS и SCR иногда путают:
DS - это спецификация, SCR - фактический пакет, который реализует спецификацию
Существуют значительные улучшения в DS в OSGi R4.2.
Многие из этих изменений поддерживаются в Equinox 3.5M5 +.
SCR («Среда выполнения компонента службы», представляющая собой «пакет расширения», реализующий новую и улучшенную OSGi R4.2 DS - декларативная служба - спецификация):
- Создает компоненты.
- Связывает их с сервисами и конфигурацией
- Управляет жизненным циклом компонента в ответ на приход и уход связанных служб.
- При желании публикует компоненты как сервисы
У вас еще есть MANIFEST.MF:
Bundle-SymbolicName : mybundle
Bundle-Version : 1.0.0
Service-Component : OSGI-INF/minimal. xml
Вы будете использовать:
org.eclipse.equinox.ds <version>.jar
org.eclipse.equinox.util <version>.jar
SCR найдет методы активации / деактивации автоматически.
Мы можем назвать их как-нибудь еще, добавив атрибуты в объявление XML .
До R4.2 имена методов не могли быть изменены, и они должны были принимать параметр типа ComponentContext
из DS API. Это сломало изящество компонента.
Таким образом, вместо того, чтобы писать "BundleActivator
" (OSGI-специфичный API в вашем компоненте: BAD), вы пишете простой объект POJO:
public class PollingComponent {
private static final int DEFAULT_PERIOD = 2000;
private PollingThread thread ;
protected void activate ( Map<String , Object> config ) {
System.out.println( " Polling Component Activated " );
Integer period = (Integer)config.get( " period " );
thread = new PollingThread(
period!=null ? period : DEFAULT_PERIOD);
thread.start();
}
protected void deactivate() {
System.out.println( " Polling Component Deactivated " );
thread.interrupt();
}
}
Вы просто объявите вашу ссылку на другие услуги:
<reference name="LOG"
interface="org.osgi.service.log.LogService "
bind="setLog" unbind="unsetLog"
cardinality="0..1"/>
И вы можете опубликовать свой компонент как сервис:
Это делается с помощью элемента <service>
в нашем XML-дескрипторе.
<service>
<provide interface="net ... ContactRepository"/>
<property name="foo" value="bar"
</service>
Предоставьте несколько услуг, просто добавив дополнительные элементы <provide>
.
Укажите свойства службы, используя элемент <property>
. Эти свойства передаются компоненту при активации и публикуются в реестре сервисов