什么时候OSGi片段附加到主机?

时间:2012-06-14 08:55:18

标签: java osgi osgi-fragment

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

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

但有时,URL为空。当我尝试列出所有可用的URL s(使用findEntries方法)时,看起来捆绑包自己的那些总是可用,但有时只是片段。我正在使用Felix 4.0.2,捆绑包和片段在同一Felix处启动。 auto.start level。

2 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:0)

在片段束的解析过程中,片段被附加到主机。 主机已解析,即使片段不存在,也可以成功启动;但是片段依赖于主机 - 它可以被解析,然后只有在它连接到主机后才能启动。

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

你可以做的是例如为片段提供比宿主束更早的开始级别。即使主机包尚未启动,片段也应该解析并成功启动。它只需要解析主机包。

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