【发布时间】:2016-05-18 19:59:43
【问题描述】:
我正在使用 Netbeans 和 Maven 在 Mac OS X 上开发一个带有声明式服务的桌面 OSGi 应用程序。我从 Java 应用程序中启动 Felix 框架,并使用 AutoProcessor.process() 加载我的 OSGi 包。
但是,我无法激活其他服务中引用的服务。例如,我有一个服务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 { ... }
在我创建了A 类型的捆绑包后,AImpl.b 的值始终为null。
我启动 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 代码会使 Felix 框架处理 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 等命令,尽管所有三个包(命令、运行时、shell)都是可用。
我已经简化了示例并更改了相关各方的名称以保护无辜者 :-) 我希望结构足够清晰,以显示我正在尝试做什么以及什么不起作用。
我搜索了felix ds embedded 之类的术语,并找到了this 之类的文章,这听起来就像我希望的那样简单。显然我在某个地方犯了一个错误:我将不胜感激。
【问题讨论】:
标签: osgi apache-felix declarative-services