2016-02-09 2 views
0

Я разрабатываю настольное приложение OSGi с декларативными сервисами в Mac OS X с использованием Netbeans и Maven. Я запускаю Felix framework из приложения Java и загружаю свои пакеты OSGi с помощью AutoProcessor.process().Использование декларативных услуг со встроенной инфраструктурой Felix

Однако я не могу получить услуги, на которые ссылаются другие службы для активации. В качестве примера, у меня есть служба AImpl, которая относится к обслуживанию B следующим образом:

interface A {} 

interface B {} 

@Component 
@Service(A.class) 
class AImpl implements A { 
    @Reference(strategy = EVENT) 
    B b; 
    ... 
} 

@Component 
@Service(B.class) 
class BImpl implements B { ... } 

Значение AImpl.b всегда null после того, как я создал связку типа A.

Моего кода для запуска рамки Felix выглядит следующим образом:

Map felixConfiguration = ...; 

try { 
    framework = new Felix(felixConfiguration); 
    framework.init(); 

    final BundleContext frameworkBundleContext = framework. 
       getBundleContext(); 

    AutoProcessor.process(felixConfiguration, frameworkBundleContext); 

    framework.start(); 

    framework.waitForStop(0); 
    System.exit(0); 

} catch (Exception ex) { 
    log.error("Could not start framework", ex); 
    System.exit(-1); 
} 

felixConfiguration содержит - среди многих других вещей - определение каталога, из которого будут загружены пучки, содержащие DS услуг являются.

Однако я получаю сообщение об ошибке, как следующее:

DEBUG: BundleA (12): [AImpl(6)] Updating target filters 
DEBUG: BundleA (12): [AImpl(6)] No change in target property for dependency b: currently registered: false 
DEBUG: BundleA (12): [AImpl(6)] No existing service listener to unregister for dependency b 
DEBUG: BundleA (12): [AImpl(6)] Setting target property for dependency b to null 
DEBUG: BundleA (12): [AImpl(6)] New service tracker for b, initial active: false, previous references: {} 
DEBUG: BundleA (12): [AImpl(6)] dm b tracker reset (closed) 
DEBUG: BundleA (12): [AImpl(6)] dm b tracker opened 
DEBUG: BundleA (12): [AImpl(6)] registering service listener for dependency b 
DEBUG: BundleA (12): [AImpl(6)] Component enabled 
DEBUG: BundleA (12): [AImpl(6)] ActivateInternal 
DEBUG: BundleA (12): [AImpl(6)] Activating component from state 4 
DEBUG: BundleA (12): [AImpl(6)] Dependency not satisfied: b 
DEBUG: BundleA (12): [AImpl(6)] Not all dependencies satisfied, cannot activate 

Мне кажется, что некоторый SCR код отсутствует, что сделает рамочное соглашение с Феликсом услугами DS. Я включил org.apache.felix.scr-1.8.2.jar (и, альтернативно, org.apache.felix.scr-2.0.2.jar и org.apache.felix.scr.compat-1.0.2.jar) в зависимости, но этого, похоже, недостаточно.

Дополнительный симптом, который я принимаю связан с той же проблемой: gogo начинается, но не распознает команды, как help, lb и т.д., хотя все три связок (команды, во время выполнения, оболочка) доступны.

Я упростил примеры и изменил имена сторон, вовлеченных в защиту невинных :-) Я надеюсь, что структура достаточно ясна, чтобы показать, что я пытаюсь сделать и что не работает.

У меня есть условия для googled как felix ds embedded и найдены такие статьи, как this, которые заставляют его звучать так же просто, как мне бы хотелось. Ясно, что я где-то ошибаюсь: я был бы благодарен за указатели.

ответ

0

Что вы делаете, на первый взгляд хорошо выглядит. Трудно сказать без всяких подробностей.

Вы, кажется, используете аннотации scr. Поскольку теперь есть стандартные аннотации DS, я предлагаю вам попробовать. Я получил full example here.

Обычно я использую karaf для своих примеров, но он также должен работать в простом феликсе.

Одна вещь, которую вы можете попробовать, - установить ваши пакеты в karaf и использовать оболочку karaf для анализа, если есть что-то странное. Просто установите функцию scr и поместите свои пакеты в каталог развертывания.

Если это работает, ваш комплект правилен и, вероятно, проблема с вашим развертыванием felix.

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

+0

Спасибо за обратную связь: Я пойду через свои очки один за другим, и увидеть, если я могу изолировать проблему. Я выхожу из вашего ответа, что никаких специальных шагов не требуется при запуске декларативных сервисов из встроенной системы Felix, кроме загрузки соответствующего пакета org.apache.felix.scr. –

+0

Да. Ссс-пакета должно быть достаточно. Для новых функций вам может понадобиться достаточно новый Felix, но я не уверен, что это требуется вообще. Вы можете попробовать получить BundleContext из Framework и пройти через пучки в цикле для печати своего состояния. В тестах я также часто просто запускаю каждый пучок в цикле. Затем будет распечатано исключение, если запуск или разрешение не будут успешными. –

0

Я решил проблему после удаления приложения вплоть до основ, что в данном случае является кодом для запуска Felix.

Ключом к проблеме было признание того, что инфраструктура OSGi, встроенная в обычную программу Java, представляет собой собрание из двух миров: связки и POJO. В эти дни много POJO распространяются с OSGi-совместимыми манифестов, но они все еще POJO, а не пакеты. Но я все вложил в манифест OSGi в каталог пакетов и загрузил их AutoProcessor.process(). Это включало такие вещи, как org.apache.felix.framework и org.apache.felix.main, но также и различные POJO, связанные с протоколированием. Это, по-видимому, вызвало описанное выше поведение.

Я исправил это, связав org.apache.felix.framework, org.apache.felix.main и регистрационные POJO классическим способом и исключая их из AutoProcessor.process().

К сожалению, slf4j-api, кажется, ведет двойную жизнь, и есть много пакетов, некоторые из которых я использую, которым это нужно как комплект. Вместо того, чтобы экспериментировать с загрузкой его дважды (классическая ссылка и AutoProcessor.process()), я просто добавил pax-logging-api и pax-logging-service в каталог моих пакетов, и вместо этого загрузите их AutoProcessor.process().

Все это имеет смысл с задним числом ;-)

Смежные вопросы