OSGi:以编程方式将导入添加到捆绑包

时间:2009-10-07 07:38:56

标签: import osgi bundle

如何从代码中将包添加到包的导入?我需要它,因为我使用依赖于反射并需要其他包的库,我不想为我开发的每个包手动将这些包添加到MANIFEST.MF

2 个答案:

答案 0 :(得分:3)

你做不到。 Import-Packages在Resolution阶段进行评估。 (阶段已安装 - >已解决 - >有效)。

当捆绑包处于活动状态时,您的代码将被执行,因此无法添加Import-Packages。

你可以做两件事:

  • 导入 - 打包您将要使用的包
  • 使用Dynamic-ImportPackage属性指定其分辨率可以延迟到执行时间的包

答案 1 :(得分:0)

除了Filippo的解决方案,您还可以尝试反转依赖关系。 F.i.而不是调用和检查其他bundle,你可以让bundle做到这一点。另一种方法是使用捆绑跟踪器并获取被跟踪的捆绑包的ClassLoader。使用此类加载器,您可以“作为捆绑”,因此您不再需要Import-Package子句。

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

如果没有任何帮助(作为最后的手段),您还可以创建(在内存中)核心包作为主机的片段,提供所需的导入。 BundleContext为您提供了一种从流加载包的方法。然后,您必须更新并调用主机包上的refreshpackages(通过PackageAdmin服务)以获取更新的ClassLoader(意味着重新启动您的包)。但是,最后,您将可以访问所有包。

作为旁注,我不建议通过调整import语句来操作主机包,然后更新...这会使您的包不确定,并且不能使用已签名的包。此外,这是对OSGi所期望的一切(想象一下随着时间的推移不断增长的捆绑......你需要在某些时候缩小进口!)

干杯, 米尔科