Можно ли использовать Felix Dependency Manager в плагине Eclipse?

Я написал пакет, который использует управление зависимостями Apache Felix. Его активатор расширяет DependencyActivatorBase. Но Plugin my plugin activator расширяет AbstractUIPlugin. Как я могу получить услуги от менеджера зависимостей felix из подключаемого модуля eclipse?

DependencyManager имеет метод getDepenencyManagers, но это список, не знаю, как узнать правильного менеджера в списке.


person harschware    schedule 07.06.2013    source источник


Ответы (2)


Да, вы можете использовать Dependency Manager в любой среде OSGi, включая Equinox (на которой основан Eclipse).

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

Итак, просто измените свой активатор на расширение DependencyActivatorBase вместо AbstractUIPlugin.

person Neil Bartlett    schedule 08.06.2013
comment
Совершенно верно, я расширил образцы PDE. Думаю, я просто предположил, что AbstractUIPlugin был необходимым компонентом для добавления любых элементов пользовательского интерфейса в мой плагин. Не могли бы вы вкратце сказать, какова цель AbstractUIPlugin? - person harschware; 08.06.2013
comment
AbstractUIPlugin упрощает доступ к таким вещам, как настройки и реестр образов. JavaDoc для класса содержит полную информацию. Однако ни одна из этих вещей не является труднодоступной... если они вам нужны, просто прочитайте код AbstractUIPlugin и следуйте тому же шаблону. - person Neil Bartlett; 09.06.2013

Класс DependencyActivatorBase — это просто базовый класс, созданный для вашего удобства. Если по какой-то причине вы не можете его использовать (например, в вашем случае), вы всегда можете самостоятельно создать экземпляр DependencyManager из своего собственного класса. Все, что ему нужно, это ссылка на BundleContext (которую вы можете получить из метода start() BundleActivator, предполагая, что вы реализуете это самостоятельно). Затем просто сделайте что-то вроде этого:

DependencyManager dm = new DependencyManager(bundleContext);
dm.add(dm.createComponent()
  .setImplementation(YourComponent.class)
  .add(dm.createServiceDependency()
    .setService(LogService.class)
  )
);
person Marcel Offermans    schedule 10.06.2013
comment
Я думал о DependencyManager, таком как Spring ApplicationContext. Итак, в отличие от Spring ApplicationContext, можно ли иметь более одного DependencyManager? Я предполагаю, что в одном DependencyManager нет необходимости, поскольку он просто взаимодействует со службами, поддерживаемыми контейнером OSGI, а не поддерживает их в своем собственном контексте? - person harschware; 11.06.2013
comment
Это прекрасно. У вас должен быть как минимум один DependencyManager для каждого пакета, но это потому, что он использует BundleContext, который вы передаете в конструкторе, и он не должен использоваться совместно между пакетами. Вы можете использовать более одного DependencyManager на пакет, если хотите. Это просто экземпляр, который содержит декларативные данные о компонентах и ​​их зависимостях. - person Marcel Offermans; 11.06.2013