Я разрабатываю настольное приложение 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, которые заставляют его звучать так же просто, как мне бы хотелось. Ясно, что я где-то ошибаюсь: я был бы благодарен за указатели.
Спасибо за обратную связь: Я пойду через свои очки один за другим, и увидеть, если я могу изолировать проблему. Я выхожу из вашего ответа, что никаких специальных шагов не требуется при запуске декларативных сервисов из встроенной системы Felix, кроме загрузки соответствующего пакета org.apache.felix.scr. –
Да. Ссс-пакета должно быть достаточно. Для новых функций вам может понадобиться достаточно новый Felix, но я не уверен, что это требуется вообще. Вы можете попробовать получить BundleContext из Framework и пройти через пучки в цикле для печати своего состояния. В тестах я также часто просто запускаю каждый пучок в цикле. Затем будет распечатано исключение, если запуск или разрешение не будут успешными. –