如何在嵌入式 OSGi 应用程序中管理 bundles/dependencies?

How to manage bundles/dependencies in embedded OSGi application?

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

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

在这种情况下,由于这个 class "duplication" 问题,我再次无法投射服务 class。

我明白为什么 class 是 "duplicated",但我不确定该怎么做。

我当前的设置:

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

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

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

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

这将导出您的 class 路径中的任何包,因此也会导出您的 API 包。由于框架现在导出这些包,您的插件将使用标准 class 路径作为提供者。因此,API只有一个来源,你不会进入class地狱。