2

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

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

未调用服务侦听器,并且我无法转换返回的 Plugin 对象,因为我的 Host 应用程序的 Plugin.class 与捆绑包内的 Plugin.class 不同。

  • 在宿主应用程序中注册“PluginManager”并将该管理器加载到包中。

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

我理解为什么这些类是“重复的”,但我不知道该怎么做。

我目前的设置:

  • plugin-api maven 模块:提供插件接口
  • app maven 模块:包含嵌入 Apache Felix 的应用程序
  • dummy 插件仅依赖于 plugin-api

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

4

1 回答 1

3

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

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

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

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

于 2018-03-15T08:47:44.893 回答