【问题标题】:OSGi: programmatically add imports to a bundleOSGi:以编程方式将导入添加到包中
【发布时间】:2009-10-07 07:38:56
【问题描述】:

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

【问题讨论】:

  • 当涉及到 OSGi 时,您似乎错过了全局的一部分:显式声明了依赖项。

标签: import osgi bundle


【解决方案1】:

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

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

你可以做两件事:

  • 导入-打包你要使用的包
  • 使用 Dynamic-ImportPackage 属性指定其解析可以推迟到执行时间的包

【讨论】:

  • Dynamic-ImportPackage 不鼓励使用,因为它比 OSGi 试图修复的平面类路径问题好一点。
【解决方案2】:

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

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

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

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

干杯, 米尔科

【讨论】:

  • 我使用的一些第 3 方库使用我的包的类加载器来查找自己的类。这在 WAR 环境中运行良好,而不是 OSGi。我最终需要将这些包添加到我的包中。随着我开发越来越多的捆绑包,这变得乏味。
  • 好的,所以它类似于:bundle(3rdP) -> bundle(me) -> bundle(3rdP) 所以它类似于日志记录。 3rdP 是一些提供 HelloWorld 和特定 LogFormatter 的包,其中“me”提供了日志记录 API。 HelloWorld 调用 Logging API,作为回报,它需要格式化程序来打印日志输出。有几种方法可以解决这个问题: - 为所需的类加载器(在“我”中)提供参数 - 使用 ext 提供查找服务。贡献者 - 一个 ClassTracker(跟踪所有捆绑包并检查在哪里可以找到要加载的特定类 - 很难实现,版本控制在这里是一个问题)
猜你喜欢
  • 2013-07-03
  • 2021-07-31
  • 2013-12-25
  • 2011-11-09
  • 2011-02-20
  • 1970-01-01
  • 2014-08-20
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多