目标
我目前正在调整现有的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能告诉我哪些包丢失了吗?),那么调试我的设置会很容易。
答案 0 :(得分:2)
Felix的行为是正确的,因为你没有启动任何捆绑包。如果您不启动它们,则无需解决它们,因此它们会保持INSTALLED
状态。
为了让您的应用程序实际执行任何操作,您需要启动捆绑包。您应该在之后安装所有软件包之后执行此操作...也就是说,您应该在开始任何软件包之前安装所有软件包。最简单的方法是将Bundle
返回的installBundle()
个对象累积到一个列表中,然后在此列表上再次调用Bundle.start()
。
答案 1 :(得分:0)
首先想到的是起始水平。我无法分辨我在这里看到的捆绑包的起始级别是什么,但这可能是您需要研究的内容。
关于你的问题,OSGI规范(版本4.3,这就是我现在使用的那个)在 4.4.2 Bundle State 部分描述了这一点。如果您的捆绑包尚未启动(通过启动级别或手动启动),它们将处于已安装状态。
如果安装Felix gogo shell并检查软件包的启动级别以及是否满足所有要求,可能会有所帮助。希望有所帮助。
编辑:原来我错了,删除了这一行:“我相信Felix会在安装时自动尝试解决捆绑问题,但我现在没有什么可以支持的。”