如何调用多个OSGi模块

时间:2015-12-20 08:19:40

标签: java osgi osgi-bundle

我有一个包含三个模块的OSGi项目:Core,A和B.想法是在Core启动时启动/运行A和B.

目前我使用的方法无法在现实应用中使用:

mvn clean install Core.jar
mvn clean install A.jar
mvn clean install B.jar

然后

D:\felix-framework-5.4.0>java -jar bin\felix.jar

install file:/"D:/workingDir/Sample~1/Eclipse/Core-1.0.jar"
install file:/"D:/workingDir/Sample~1/Eclipse/A-1.0.jar"
install file:/"D:/workingDir/Sample~1/Eclipse/B-1.0.jar"

我怎样才能做到这一点。我可以使用任何框架/ OSGi服务器来实现这个想法吗?哪些研究主题可以帮助我们了解这个问题?

我想将Core放在根目录中,然后将其他插件捆绑在plugins文件夹中。如何从核心动态查找并调用plugins文件夹中的模块?

OSGi-Project
    + Core.jar
    + plugins
        + A.jar
        + C.jar
        + D.jar
        + ****.jar

更新

方案

我正在处理的应用程序是OSGi独立桌面应用程序。例如,Core将在左侧(左窗格)中保留一个窗格。 left-pane将接受来自实现名为nodes的接口的任何模块的LeftPane A 实现LeftPane接口。每当启动Core时,它应该扫描一个文件夹,在这种情况下是OSGi-Project并自动启动那里的所有包,包括A,这将继续填充左窗格。

2 个答案:

答案 0 :(得分:1)

感谢您的澄清。据我所知,你真的不需要动态加载或扫描。相反,我建议你让你的插件模块使用接口LeftPane实现一个服务,并在OSGi注册表中发布它。

然后,您的核心模块可以侦听实现LeftPane的所有服务,并从这些服务中填充UI。

要做到这一点,您可以围绕服务利用OSGi API,甚至更好地使用DS或蓝图等框架。

答案 1 :(得分:1)

http://inflamedjava.blogspot.co.at/2014/01/simple-plugin-management-using-osgi.html

您无法在其他方法上添加观察程序。但你可以做的是添加某种观察者。如果核心中有动作,您可以获得所有可用的观察者并触发它们。

Collection<ServiceReference<Observer>> refs = bundleContext.getServiceReferences(Observer.class);
for ( ... : refs ) {
   ref.invoke(...)
}