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