OSGi框架如何设置Bundle ID?

时间:2011-09-22 20:56:47

标签: osgi

我正在尝试在main方法中运行OSGi框架(Equinox)。 每次我启动框架时,当我打印BundleContext.getBundles().length时,它表示框架上只安装了1个Bundle(当然是系统包)。 当我安装第一个捆绑包时,捆绑包ID将从上一个会话继续。假设我上次会话有4个捆绑包(我在停止系统捆绑包之前已经停止并卸载了所有捆绑包),第一个捆绑包ID设置为5。 现在,我想知道框架如何选择捆绑ID?框架为什么以及如何记住最后一个会话,即使我已经卸载了所有捆绑包?是因为Bundle Cache吗?如果是,我该如何清除缓存(从1重新开始编号)?

3 个答案:

答案 0 :(得分:6)

框架在它管理的持久存储中的某个地方有最后一个使用的bundle id。这个商店看起来像是一个框架实现细节。启动框架时,可以指定org.osgi.framework.storage.clean框架配置属性。这将清除所有已安装的软件包,但我不确定它是否会重置上次使用的软件包ID。

答案 1 :(得分:2)

删除equinox/org.eclipse.osgi文件夹会重置编号。在删除之前,请确保您的软件包在此文件夹下没有任何重要数据。

具有有效包ID的bundle命令可以显示equinox/org.eclipse.osgi文件夹的绝对路径:

osgi> bundle 7
slf4j.api_1.6.1 [7]
  Id=7, Status=ACTIVE      Data Root=D:\temp\test\equinox\org.eclipse.osgi\bundles\7\data
...

答案 2 :(得分:0)

以下是 OSGI Core Release 8 规范关于包标识符的说明:

Bundle identifier - A long that is a Framework assigned unique
identifier for the full lifetime of a bundle, even if it is updated
or the Framework is restarted. Its purpose is to distinguish
bundles in a Framework. Bundle identifiers are assigned in
ascending order to bundles when they are installed. The method 
getBundleId() returns a bundle's identifier.

因此 at 告诉我们关于包标识符的两个重要属性:1.) 从安装到卸载,bundleId 和包之间的关系是稳定的,以及 2.) 分配包标识符按安装时的升序排列。

回到最初的问题,尝试获取包标识符编号分配以重新开始工作违反了用于包标识的 OSGI 规范,并且您不应该试图控制包标识。例如,假设您安装了三个包:

b1(0), b2(1), b3(2)

现在假设您卸载了 bundle b2(id = 1):

b1(0),b3(2)

现在假设您重新安装 b2:

b1(0),b3(2),b2(3)

请注意,b2 获得了分配给它的新 ID。只要不卸载 b2,该 id 就可以稳定地引用 b2。如果您注意到,不再使用 1 的 id。 Bundle id 是一个标识符,而不是数组的索引。 b3 的 bundleId 不能更改,因为它没有被卸载,b2 不能被分配 1 的 bundleId,因为这会违反捆绑标识符在安装时按升序分配的规则(OSGI 框架没有不记得之前安装和卸载过 b2 - 看起来它只是第一次安装)。鉴于 bundleId 很长,这意味着我们需要卸载 9,223,372,036,854,775,807 次 bundle,然后 OSGI 的 bundle id 编号分配方案会用完 id。