java - 如何管理嵌入式 OSGi 应用程序中的 bundle /依赖项?

标签 java osgi apache-felix embedded-osgi

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

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

未调用服务监听器,并且我无法转换返回的 Plugin 对象,因为我的主机应用程序的 Plugin.class 与 bundle 内的 Plugin.class 不同。

  • 在主机应用程序中注册“PluginManager”并在 bundle 中加载该管理器。

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

我明白为什么这些类是“重复的”,但我不知道该怎么办。

我当前的设置:

  • plugin-api maven模块:提供Plugin接口(interface)
  • app maven 模块:包含嵌入 Apache Felix 的应用
  • 虚拟插件仅依赖于plugin-api

我的设置结构有问题吗?如何访问主机服务而不造成类(class)困惑?我是否应该创建另一个模块来编译我的插件,但它被排除在 bundle 之外,然后通过 FRAMEWORK_SYSTEMPACKAGES_EXTRA 在主机上提供?

最佳答案

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

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

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

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

关于java - 如何管理嵌入式 OSGi 应用程序中的 bundle /依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288206/

相关文章:

Gradle、OSGI 和依赖管理

list - 有没有办法在 OSGi 应用程序中查看注册的服务?

java - 使用嵌入式 OSGi 容器

java - OSGI DS : properties -> ParseException

java - 如何向桌面 Apache Felix 应用程序添加服务

Java 移位运算符

Java - 通过构造函数将泛型列表传递给类

java - 使用 Velocity 作为 OSGi 包时 ResourceManager 类不匹配

java - Selenium - 单击仅在将鼠标悬停在其上方时出现的隐藏按钮

java - 如何为使用 FreeMarker 模板的代码编写单元测试?