Objective
我目前正在调整现有的Java应用程序,将其转换为基于插件的系统 . 这是一个基于Spring MVC的Web服务,提供各种服务 . 我打算使这些服务可插入,由OSGi捆绑提供 . 我已经拥有提供这些服务的所有OSGi包,使用 maven-bundle-plugin
创建 .
What I have done
我决定使用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
通过上下文安装所有bundle:
context.installBundle(jarPath)
并启动框架:
framework.start();
然后我检查所有bundle的状态,除框架外都有 INSTALLED
状态 . 框架包是 ACTIVE
.
显然安装的捆绑包没有解决 .
Question
Felix何时试图解决捆绑问题?根据我对OSGi生命周期的理解,解决方案会自动发生 . 但我不知道Felix是否甚至试图解决这些捆绑问题 . 即使我将日志级别配置为DEBUG,它也不会打印任何日志 . 如果我能看到某个捆绑包无法解决的原因(即Felix能告诉我哪些包丢失了吗?),那么调试我的设置会很容易 .
2 回答
Felix的行为是正确的,因为你没有启动任何捆绑包 . 如果你不启动它们,那么就没有必要解决它们,因此它们会保持在
INSTALLED
状态 .为了让您的应用程序实际执行任何操作,您需要启动捆绑包 . 您应该在安装所有软件包之后执行此操作...也就是说,您应该在开始任何软件包之前安装所有软件包 . 最简单的方法是将
installBundle()
返回的Bundle
对象累积到一个列表中,然后在此列表上执行第二次循环,调用Bundle.start()
.首先想到的是起始水平 . 我无法分辨我在这里看到的捆绑包的起始级别是什么,但这可能是您需要研究的内容 .
关于你的问题,OSGI规范(版本4.3,这就是我现在使用的那个)在第4.4.2节捆绑状态中描述了这一点 . 如果您的捆绑包处于已安装状态't been started (either through start level or manually), they' .
如果您安装Felix gogo shell并检查软件包的启动级别以及是否满足所有要求,这可能会有所帮助 . 希望有所帮助 .
编辑:原来我错了,删除了这一行:“我相信Felix会在安装时自动尝试解决捆绑问题,但我现在没有什么可以支持的 . ”