我有一个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
为null。 当我试图列出所有可用的URL
秒(使用findEntries
法),似乎管束自己的人都可以永远,但那些片段只是偶尔。 我使用的是Felix
4.0.2包和片段的同时开始Felix
。 auto.start水平。
片段连接到主机,在主机解决的时间。 通常,片段将被只要主机结算前它被安装附接。
但是总有可能为主机解决无片段,因为主机不依赖于它们的片段。 所以通常你应该写你的主机,以便它可以用不存在的片段处理 - 即它不应该丢的NPE等。
由于OSGi的R4.3您可以使用其将从主机依赖于它的片段Require-Capability
和Provide-Capability
头。 通过发明自己的命名空间的依赖,你可以让你的片段为它提供Provide-Capability
。 然后,您的主机可以要求它与Require-Capability
....现在OSGi框架将确保片段必须是可用它解析主机之前。
该片段在片段束的分辨处理连接至主机。 主机解决并能成功,即使片段不存在启动; 但片段是依赖于主机上 - 它可以被解决,它是连接到主机后,才开始算账。
通过具有相同的起始水平都束,看来你已经创建了这两个包的竞争条件。 该框架开始解决并开始在同一时间两束。 有时,它管理片段的解析过程已经完成之前启动主机包 - >然后主机捆绑的启动方法的行为,如果没有片段是可用的。
你可以做的是例如给片段比主机捆绑的早期起步阶段。 该片段应解决并成功启动即使主机捆绑尚未启动。 它只需要在主机捆绑解决。
您也可以测试其他OSGi框架这种行为-例如,在ProSyst的mBedded服务器(MBS) -我知道,这是与其中规定解决上述片段OSGI规范4.2完全兼容。