我目前正在开发一个插件系统,我将apache felix嵌入到我的应用程序中。插件本身就是OSGi捆绑包。到目前为止,部署捆绑包工作正常,但我无法与我的捆绑包/插件交互。我尝试了两种方法:
在我的插件中注册服务"插件">- ,并在我的"主机"应用程序中使用服务侦听器与插件进行交互。
服务侦听器未被调用,我无法强制转换返回的插件对象,因为我的主机应用程序的插件.class与捆绑包内的插件相比.class是不同的。
- 在主机应用程序中注册"插件管理器",并将此管理器加载到捆绑包中。
在这种情况下,由于此类"重复"问题,我再次无法转换服务类。
我理解为什么这些类是"重复的",但我不确定该怎么办。
我目前的设置:
- 插件-API maven 模块:提供插件接口
- app maven 模块:包含嵌入 Apache Felix 的应用程序
- 虚拟插件仅依赖于插件 API
我的设置结构有问题吗?如何在不造成类混乱的情况下访问主机服务?我是否应该创建另一个模块来编译我的插件,但它被排除在捆绑包之外,然后通过FRAMEWORK_SYSTEMPACKAGES_EXTRA在主机上提供?
您应该在应用程序端定义插件 API(以及它使用的所有非基于 VM 的类型)。如果我这样做,我会创建一个 API 包(是的捆绑包)来导出这些包。
确保所有插件都不要导出 API,或者至少允许导入它。
在您的应用程序中,在启动 Felix 嵌入式框架之前,您可以使用getResources("META-INF/MANIFEST.MF")
获取类路径上所有 JAR 的所有清单,并检查Export-Package
。然后连接所有这些导出的包,并将 OSGi 框架属性org.osgi.framework.system.packages.extra
设置为连接的字符串。
这将导出类路径上的任何包,API 捆绑包也是如此。由于框架现在导出这些包,因此您的插件将使用标准类路径作为提供程序。因此,API 将只有一个源,您不会进入类地狱。