如何在嵌入式 OSGi 应用程序中管理 bundles/dependencies?
How to manage bundles/dependencies in embedded OSGi application?
我目前正在开发一个插件系统,我将 apache felix 嵌入到我的应用程序中。插件本身就是 OSGi 包。到目前为止,部署捆绑包工作得很好,但我无法与我的 bundles/plugins 交互。我尝试了两种方法:
- 在我的插件中注册服务 "Plugin" 并在我的 "host" 应用程序中使用服务侦听器与插件交互。
服务侦听器未被调用,我无法转换返回的插件对象,因为我的主机应用程序的 Plugin.class 与捆绑包中的 Plugin.class 不同。
- 在主机应用程序中注册 "PluginManager" 并在包中加载此管理器。
在这种情况下,由于这个 class "duplication" 问题,我再次无法投射服务 class。
我明白为什么 class 是 "duplicated",但我不确定该怎么做。
我当前的设置:
- plugin-apimaven模块:提供Plugin接口
- app maven 模块:包含嵌入 Apache Felix 的应用程序
- 虚拟插件只依赖插件-api
我的设置结构有问题吗?如何在不造成 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地狱。
我目前正在开发一个插件系统,我将 apache felix 嵌入到我的应用程序中。插件本身就是 OSGi 包。到目前为止,部署捆绑包工作得很好,但我无法与我的 bundles/plugins 交互。我尝试了两种方法:
- 在我的插件中注册服务 "Plugin" 并在我的 "host" 应用程序中使用服务侦听器与插件交互。
服务侦听器未被调用,我无法转换返回的插件对象,因为我的主机应用程序的 Plugin.class 与捆绑包中的 Plugin.class 不同。
- 在主机应用程序中注册 "PluginManager" 并在包中加载此管理器。
在这种情况下,由于这个 class "duplication" 问题,我再次无法投射服务 class。
我明白为什么 class 是 "duplicated",但我不确定该怎么做。
我当前的设置:
- plugin-apimaven模块:提供Plugin接口
- app maven 模块:包含嵌入 Apache Felix 的应用程序
- 虚拟插件只依赖插件-api
我的设置结构有问题吗?如何在不造成 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地狱。