如何在嵌入式OSGi应用程序中管理bundle/依赖关系?



我目前正在开发一个插件系统,我将apache felix嵌入到我的应用程序中。插件本身就是OSGi捆绑包。到目前为止,部署捆绑包工作正常,但我无法与我的捆绑包/插件交互。我尝试了两种方法:

在我的插件中注册服务"插件">
  • ,并在我的"主机"应用程序中使用服务侦听器与插件进行交互。

服务侦听器未被调用,我无法强制转换返回的插件对象,因为我的主机应用程序的插件.class与捆绑包内的插件相比.class是不同的。

  • 在主机应用程序中注册"插件管理器",并将此管理器加载到捆绑包中。

在这种情况下,由于此类"重复"问题,我再次无法转换服务类。

我理解为什么这些类是"重复的",但我不确定该怎么办。

我目前的设置:

  • 插件-API maven 模块:提供插件接口
  • app maven 模块:包含嵌入 Apache Felix 的应用程序
  • 虚拟插件仅依赖于插件 API

我的设置结构有问题吗?如何在不造成类混乱的情况下访问主机服务?我是否应该创建另一个模块来编译我的插件,但它被排除在捆绑包之外,然后通过FRAMEWORK_SYSTEMPACKAGES_EXTRA在主机上提供?

您应该在应用程序端定义插件 API(以及它使用的所有非基于 VM 的类型)。如果我这样做,我会创建一个 API 包(是的捆绑包)来导出这些包。

确保所有插件都不要导出 API,或者至少允许导入它。

在您的应用程序中,在启动 Felix 嵌入式框架之前,您可以使用getResources("META-INF/MANIFEST.MF")获取类路径上所有 JAR 的所有清单,并检查Export-Package。然后连接所有这些导出的包,并将 OSGi 框架属性org.osgi.framework.system.packages.extra设置为连接的字符串。

这将导出类路径上的任何包,API 捆绑包也是如此。由于框架现在导出这些包,因此您的插件将使用标准类路径作为提供程序。因此,API 将只有一个源,您不会进入类地狱。

相关内容

  • 没有找到相关文章

最新更新