嵌入 OSGi 框架:啥时候应该完成捆绑解析?

Posted

技术标签:

【中文标题】嵌入 OSGi 框架:啥时候应该完成捆绑解析?【英文标题】:Embedding OSGi framework: when does bundle resolution should be done?嵌入 OSGi 框架:什么时候应该完成捆绑解析? 【发布时间】:2013-11-10 20:14:27 【问题描述】:

目标

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

我做了什么

我决定使用 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();

然后我检查所有包的状态,除框架之外的所有包都具有INSTALLED 状态。框架包是ACTIVE

很明显,安装的包没有被解析。

问题

Felix 什么时候尝试解析捆绑包?根据我对 OSGi 生命周期的理解,解决会自动发生。但我不知道菲利克斯是否甚至试图解决这些捆绑包。即使我将日志级别配置为调试,它也不会打印任何日志。如果我能看到某个包无法解析的原因(即,Felix 可以告诉我缺少哪些包?),那么调试我的设置会很容易。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

首先想到的是起始级别。我无法从我在这里看到的内容中看出你的捆绑包的起始级别是什么,但这可能是你需要研究的东西。

至于您的问题,OSGI 规范(4.3 版,这就是我现在手头的东西)在 4.4.2 Bundle State 部分对此进行了描述。如果您的捆绑包尚未启动(通过启动级别或手动启动),它们将处于已安装状态。

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

编辑:原来我错了,删除了这一行:“我相信 Felix 会在安装期间自动尝试解析捆绑包,但我现在没有什么可以备份的。”

【讨论】:

不,Felix 在安装时不会自动解析捆绑包。确实不能,这将违反规范并破坏 OSGi 中的许多内容。 此外,这里的启动级别无关紧要,因为没有启动任何包。启动级别不会导致捆绑包神奇地启动,它只是控制启动指令生效的顺序。 你是对的,尼尔。感谢您的指正。关于启动级别,低于系统级别的包启动级别不会导致框架启动有问题的包吗? No.. OSGi 框架从不 自动启动包,它们总是需要通过调用start() 显式启动。唯一的例外是 OSGi 是持久的,因此如果您关闭并重新启动,之前启动的包仍将在新的运行时启动。

以上是关于嵌入 OSGi 框架:啥时候应该完成捆绑解析?的主要内容,如果未能解决你的问题,请参考以下文章

ClassCastException 在应用程序中使用 log4j 嵌入 osgi felix 而捆绑包使用 log4j

我们啥时候应该在 Xcode 中使用“嵌入式二进制文件”而不是“链接框架”?

OSGi 捆绑为插件架构中的 SOAP Web 服务

源码解析之访问osgi felix bundle中的文件和资源

OSGI 缺少需求错误

Apache Felix 和 Apache Tomcat 有啥区别