嵌入OSGi框架:何时应该进行捆绑解析?

时间:2013-10-31 00:00:22

标签: java maven osgi apache-felix

目标

我目前正在调整现有的Java应用程序,将其转换为基于插件的系统。这是一个基于Spring MVC的Web服务,提供各种服务。我打算使这些服务可插入,由OSGi捆绑提供。我已经拥有了所有使用maven-bundle-plugin创建的OSGi包。

我做了什么

我决定使用OSGi R4 API将OSGI框架(Apache Felix)嵌入到我的应用程序中,将其添加为Maven依赖项:

<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.framework</artifactId>
    <version>4.2.1</version>
</dependency>

初始化:

FrameworkFactory frameworkFactory = ServiceLoader
    .load(FrameworkFactory.class).iterator().next();
Map<String, String> config = new HashMap<String, String>();
config.put(FelixConstants.LOG_LEVEL_PROP, Integer.toString(Logger.LOG_DEBUG));
this.framework = frameworkFactory.newFramework(config);
this.framework.init();
this.context = framework.getBundleContext(); // keep ref to context

通过上下文安装所有包:

context.installBundle(jarPath)

并启动框架:

framework.start();
然后,我检查所有bundle的状态,除框架外都有INSTALLED状态。框架包是ACTIVE

显然已安装的捆绑包未解决。

问题

Felix何时尝试解决捆绑问题?根据我对OSGi生命周期的理解,解决方案会自动发生。但我不知道Felix是否甚至试图解决这些捆绑问题。即使我将日志级别配置为DEBUG,它也不会打印任何日志。如果我能看出某个捆绑包无法解决的原因(即Felix能告诉我哪些包丢失了吗?),那么调试我的设置会很容易。

2 个答案:

答案 0 :(得分:2)

Felix的行为是正确的,因为你没有启动任何捆绑包。如果您不启动它们,则无需解决它们,因此它们会保持INSTALLED状态。

为了让您的应用程序实际执行任何操作,您需要启动捆绑包。您应该在之后安装所有软件包之后执行此操作...也就是说,您应该在开始任何软件包之前安装所有软件包。最简单的方法是将Bundle返回的installBundle()个对象累积到一个列表中,然后在此列表上再次调用Bundle.start()

答案 1 :(得分:0)

首先想到的是起始水平。我无法分辨我在这里看到的捆绑包的起始级别是什么,但这可能是您需要研究的内容。

关于你的问题,OSGI规范(版本4.3,这就是我现在使用的那个)在 4.4.2 Bundle State 部分描述了这一点。如果您的捆绑包尚未启动(通过启动级别或手动启动),它们将处于已安装状态。

如果安装Felix gogo shell并检查软件包的启动级别以及是否满足所有要求,可能会有所帮助。希望有所帮助。

编辑:原来我错了,删除了这一行:“我相信Felix会在安装时自动尝试解决捆绑问题,但我现在没有什么可以支持的。”