Java OSGi片段何时连接到主机?

Java OSGi片段何时连接到主机?,java,osgi,osgi-fragment,Java,Osgi,Osgi Fragment,我有一个带有持久性服务的OSGi包(使用hibernate)和一个包含配置(xml文件)的片段。在bundle的activator中,我使用以下方式加载配置: @Override public void start(BundleContext ctx) { URL url = ctx.getBundle().getResource("hibernate.cfg.xml"); SessionFactory sessionFactory = new AnnotationConfigura

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

@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,bundle和片段在同一
Felix
处启动。auto.start level。

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

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

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


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

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

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


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

感谢您的澄清!不幸的是,它不起作用。我已经将fragment的felix.auto.start级别设置为低于bundle本身。我在gogo控制台中仔细检查了这一点-包的级别高于片段。我觉得起始级别不能保证较低级别的bundle/fragment在进入较高起始级别之前完成解析。这是不正确的。首先,在解析主机时附加片段。第二,框架不能同时解决和启动问题。事实上,启动对解析没有任何影响,而且片段无论如何也不能启动。这很方便。我从未真正看到过用例失败(我们使用Equinox),但我没有意识到它可能无法“及时”解析片段。很高兴知道。我希望StackOverflow让我订阅用户,这样我就可以阅读Neil发布的所有内容了。:-)几乎每次他回答我时,我都会学到一些新东西!