【问题标题】:How to manage bundles/dependencies in embedded OSGi application?如何管理嵌入式 OSGi 应用程序中的捆绑包/依赖项?
【发布时间】:2018-08-23 14:24:18
【问题描述】:

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

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

未调用服务侦听器,我无法转换返回的 Plugin 对象,因为我的 Host 应用程序的 Plugin.class 与包内的 Plugin.class 不同。

  • 在主机应用程序中注册“PluginManager”并将此管理器加载到包中。

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

我理解为什么这些类是“重复的”,但我不知道该怎么做。

我目前的设置:

  • plugin-api maven 模块:提供插件接口
  • app maven 模块:包含嵌入 Apache Felix 的应用程序
  • dummy plugin 只依赖于 plugin-api

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

【问题讨论】:

    标签: java osgi apache-felix embedded-osgi


    【解决方案1】:

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

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

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

    这将导出您的类路径上的任何包,以及您的 API 包。由于框架现在导出这些包,您的插件将使用标准类路径作为提供者。因此,API 将只有一个来源,您不会陷入课堂地狱。

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2015-10-04
      • 2018-10-24
      • 2011-11-26
      • 2015-12-14
      • 1970-01-01
      • 2015-03-12
      • 2010-09-11
      相关资源
      最近更新 更多