首页 文章

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

提问于
浏览
3

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 回答

  • 0

    Felix的行为是正确的,因为你没有启动任何捆绑包 . 如果你不启动它们,那么就没有必要解决它们,因此它们会保持在 INSTALLED 状态 .

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

  • 2

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

    关于你的问题,OSGI规范(版本4.3,这就是我现在使用的那个)在第4.4.2节捆绑状态中描述了这一点 . 如果您的捆绑包处于已安装状态't been started (either through start level or manually), they' .

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

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

相关问题