我目前正在开发一个插件系统,我将 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/