OSGi 片段何时附加到主机?

2022-09-04 01:25:54

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

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

但有时,是空的。当我尝试列出所有可用的(使用方法)时,似乎捆绑包自己的捆绑包始终可用,但片段只是有时。我使用的是4.0.2,捆绑包和片段以相同的方式启动。自动启动级别。URLURLfindEntriesFelixFelix


答案 1

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

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

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


答案 2

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

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

例如,您可以做的是给片段一个比主机捆绑包更早的起始级别。即使主机包尚未启动,该片段也应解析并成功启动。它只需要解析主机包。

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


推荐