1

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

4

2 回答 2

3

你不能。导入包在解决阶段进行评估。(阶段已安装 -> 已解决 -> 活动)。

您的代码在捆绑包处于活动状态时执行,因此添加 Import-Packages 为时已晚。

你可以做两件事:

  • 导入-打包你要使用的包
  • 使用 Dynamic-ImportPackage 属性指定其解析可以推迟到执行时间的包
于 2009-10-08T10:49:12.247 回答
0

除了 Filippo 的解决方案,您还可以尝试反转依赖关系。Fi 而不是调用和检查其他捆绑包,您可以让捆绑包执行此操作。另一种方法是使用捆绑跟踪器并获取跟踪的捆绑包的类加载器。使用此类加载器,您可以充当“捆绑包”,因此您不再需要 Import-Package 子句。

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

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

作为旁注,我不建议通过调整导入语句然后更新来操纵您的主机包...这会使您的包不确定并且不适用于签名包。此外,这与人们对 OSGi 的期望背道而驰(想象一下随着时间的推移不断增长的捆绑包......您还需要在某个时候缩减导入!!!)

干杯,米尔科

于 2009-10-13T10:08:40.397 回答