14

我有一个OSGi包含持久性服务(使用hibernate)的包和一个包含配置(xml 文件)的片段。在捆绑包的激活器中,我正在使用以下方式加载配置:

@Override
public void start(BundleContext ctx) {
   URL url = ctx.getBundle().getResource("hibernate.cfg.xml");
   SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory();
}

但有时,它URL是空的。当我尝试列出所有可用URL的(使用findEntries方法)时,似乎捆绑包自己的总是可用的,但片段的只是有时。我使用的是Felix4.0.2,bundle 和 fragment 是从同一个Felix. 自动启动级别。

4

2 回答 2

23

解析主机时,片段会附加到主机。通常,只要在主机解析之前安装片段,就会附加片段。

然而,主机总是有可能在没有分片的情况下解析,因为主机不依赖于它们的分片。因此,通常你应该编写你的主机,以便它可以处理不存在的片段 - 即它不应该抛出 NPE 等。

Require-Capability从 OSGi R4.3 开始,您可以使用和标头将依赖项从主机引入到其片段Provide-Capability。通过为依赖项发明自己的命名空间,您可以使您的片段为其提供Provide-Capability. 然后你的主机可以要求它Require-Capability......现在OSGi框架将确保片段在解析主机之前必须可用。

于 2012-06-14T12:47:41.437 回答
0

在片段包的解析过程中,片段被附加到主机。主机已解析,即使分片不存在也能成功启动;但片段依赖于主机 - 只有在附加到主机后才能解析并随后启动。

通过使两个包具有相同的起始级别,您似乎为这两个包创建了竞争条件。框架同时开始解析和启动两个包。有时它设法在片段的解析过程完成之前启动主机包 -> 然后主机包的启动方法表现得好像没有可用的片段一样。

例如,您可以为片段提供比主机捆绑包更早的启动级别。即使主机包尚未启动,片段也应该解析并成功启动。它只需要解析主机包。

您还可以在其他 OSGi 框架上测试此行为 - 例如在ProSyst 的 mBedded Server (mBS)上- 我知道它完全符合指定上述片段解析的 OSGI 规范 4.2。

于 2012-06-14T09:40:14.497 回答