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

Import OSGi:以编程方式将导入添加到捆绑包,import,osgi,bundle,Import,Osgi,Bundle,如何从代码内部将包添加到捆绑包的导入中?我需要它,因为我使用的库依赖于反射,并且需要其他包,我不想为我开发的每个包手动将这些包添加到MANIFEST.MF中,您不能这样做。 导入包在解析阶段进行评估。(阶段已安装->已解决->活动) 您的代码是在bundle处于活动状态时执行的,因此添加导入包太迟 你可以做两件事: 导入要使用的包 使用Dynamic ImportPackage属性指定其解析可以推迟到执行时的包 除了Filippo的解决方案,您还可以尝试反转依赖关系。F.i.您可以让捆绑包进行

如何从代码内部将包添加到捆绑包的导入中?我需要它,因为我使用的库依赖于反射,并且需要其他包,我不想为我开发的每个包手动将这些包添加到MANIFEST.MF中,您不能这样做。 导入包在解析阶段进行评估。(阶段已安装->已解决->活动)

您的代码是在bundle处于活动状态时执行的,因此添加导入包太迟

你可以做两件事:

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

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

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

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

作为补充说明,我不建议通过调整import语句然后更新来操纵主机包。。。这会使您的捆绑包具有不确定性,并且无法使用已签名的捆绑包。而且,这与人们对OSGi的期望背道而驰(想象一个捆绑包随着时间的推移而不断增长……你也需要在某个时候缩减导入!!!)

干杯,
Mirko

不鼓励使用Dynamic ImportPackage,因为它比OSGi试图解决的平面类路径问题要好一点。在OSGi方面,您似乎忽略了全局的一个部分:依赖项是显式声明的。我使用的一些第三方库使用我的包的类加载器来查找它们自己的类。这在战争环境中工作得很好,而不是OSGi。我最终需要将这些包添加到我的包中。随着我开发越来越多的bundle,这会变得单调乏味。好吧,它类似于:bundle(3rdP)->bundle(me)->bundle(3rdP),所以它类似于日志记录。3rdP是提供HelloWorld和特定日志格式化程序的捆绑包,其中“me”提供日志API。HelloWorld调用日志API,反过来需要格式化程序打印日志输出。有几种方法可以解决这个问题:-为所需的类加载器(在“me”中)提供一个参数-使用ext.contributers提供一个查找服务-一个类跟踪器(跟踪所有捆绑包并检查在哪里找到要加载的特定类-很难实现,版本控制在这里是一个问题)