[英]When is an OSGi fragment attached to host?
我有一个带有持久性服务的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
(使用findEntries
方法)时,看起来捆绑包自己的URL
总是可用,但有时只是片段。 我正在使用Felix
4.0.2,捆绑包和片段是在同一个Felix
启动的。 auto.start级别。
片段连接到主机,在主机解决的时间。 通常,只要在主机解析之前安装了片段,它就会被连接。
但是,主机总是有可能在没有片段的情况下解析,因为主机不依赖于它们的片段。 因此,通常你应该写你的主机,以便它可以处理不存在的片段 - 即它不应该抛出NPE等。
从OSGi R4.3开始,您可以使用Require-Capability
和Provide-Capability
标头从主机向其片段引入依赖关系。 通过为依赖项创建自己的命名空间,您可以使您的片段为其Provide-Capability
。 然后你的主机可以要求它具有Require-Capability
....现在OSGi框架将确保片段在解析主机之前必须可用。
在片段束的解析过程期间,片段附着到主机。 主机已解析,即使片段不存在,也可以成功启动; 但是片段依赖于主机 - 它可以被解析,然后只有在它连接到主机后才能启动。
通过使两个捆绑包具有相同的起始级别,您似乎已经为这两个捆绑包创建了竞争条件。 该框架开始同时解析和启动两个包。 有时它会在片段的解析过程完成之前设法启动主机包 - >然后主机包的start方法就像没有片段可用一样。
您可以做的是例如为片段提供比宿主束更早的开始级别。 即使主机包尚未启动,片段也应该解析并成功启动。 它只需要解析主机包。
您还可以在其他OSGi框架上测试此行为 - 例如在ProSyst的mBedded Server(mBS)上 - 我知道它完全符合OSGI规范4.2,其中指定了上述片段解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.