OSGi的:以编程方式添加进口捆绑(OSGi: programmatically add impor

2019-10-17 19:37发布

如何添加包一个包的进口从内部代码? 我需要它,因为我用它依靠反射和需要其他包库,我不希望需要将这些包手动添加到MANIFEST.MF每个包我开发

Answer 1:

你不能。 进口软件包在消退期进行评估。 (阶段安装 - >解决 - >活动)。

你的代码被执行时,包被激活,因此来不及加进口的软件包。

你可以做两件事情:

  • 进口包你要使用的包
  • 使用动态ImportPackage属性指定的包,其分辨率可以推迟到执行时间


Answer 2:

除了菲利普的解决方案,你可以尝试反转依赖。 网络连接,而不是调用和检查其他捆绑包,可以让束做到这一点。 另一种方法是使用束跟踪并获得捆绑的类加载器跟踪。 有了这个类加载器,你可以充当“作为捆绑”,所以你不需要进口包装条款了。

当我开始使用OSGi,这是我来到了第一个要求。 随着时间的推移,我意识到,在几乎所有情况下,有一个更清洁,更一致的解决方案。 所以,想想看,如果你真的需要这种依赖性。 难道就没有办法来反转或抽象它来创建一个通用的解决方案吗?

如果没有什么帮助(作为最后的手段),你也可以创建(在内存中)与你的核心软件包作为东道主片段,提供所需的进口。 该BundleContext的为您提供了从流加载捆绑的方法。 然后,您必须更新并呼吁主机捆绑refreshpackages(通过PackageAdmin服务),以获取更新的ClassLoader(意味着你的包的重新启动)。 然而,到了最后,你就可以访问所有的包。

作为一个方面说明,我不建议通过调整import语句来操纵你的主机包,然后更新...这使得你的包不确定的,不会与签约捆绑合作。 此外,这是对一切从一个OSGi的预期(想象一个不断增长的包随着时间的推移......你需要收缩在某些时候进口以及!)

干杯,米尔科



文章来源: OSGi: programmatically add imports to a bundle