Equinox:框架重启后损失捆绑包更新

3
我有一个正在运行的Equinox OSGi框架,其中有一堆已启动的bundle。现在,我通过OSGi控制台使用“update”(或使用提供的方法:bundle.update(url))更新一个bundle。
一切都运行得非常完美......但是,如果我完全重新启动OSGi框架,则先前更新的bundle将再次处于原始状态(就像更新之前一样)。
我正在使用Eclipse的update.configurator搜索插件目录中的所有bundle并安装它们,但我认为它会识别已更新的bundle。
有人能给我提示我错过了什么吗?
谢谢, Michael Mangeng
1个回答

1
你是如何启动Equinox的?你是用-clean参数启动的吗(这会清除任何更新)?
请注意,'update'只会更新内存中运行的副本,而不会更改磁盘上原始JAR文件的任何位。如果你启动equinox并传入旧bundle(但不是新的),那么它可能会返回旧状态。
P2在某种程度上会妨碍bundle.update()的执行,因为它假定一旦你切割了bundle的位,那么它之后就保持不变 - 换句话说,P2实际上打破了首次执行bundle.update()的操作。然而,你应该管理磁盘上的位,以便即使有人使用-clean参数,你也能获得正确的数据。

1
你好!不,我没有使用 -clean 来启动它。目前我正在使用 Equinox 3.2,因为我从未升级到更高版本。也许问题在于我认为 bundle.update(...) 将上传的包版本存储在配置区域中(对于一系列的包进行此操作...不知道何时存储 jar 包,何时不存储)。如果是这种情况...我将更改我的代码,使上传先将文件存储到文件系统中,然后删除旧版本。如果这是正确的方法。可惜在这种情况下我无法使用 bundle.update(InputStream in)。你认为呢? - Michael Mangeng
1
OSGi规范并没有说明重启后应该持久发生什么事情,只是应该将其恢复。我不认为更新本身会更新持久bundle - 特别是对于基于文件的bundle。如果您从远程URL安装bundle然后进行更新,我不确定会发生什么。在任何情况下,在此情况下,规范的这个区域是未定义的 :-)请注意,如果需要,仍然可以使用bundle.update(InputStream); 但是,您必须安排在正确位置原地更新位,并在更新之后调用update()。 - AlBlue
我会更改我的实现方式,以便替换原始的基于文件的束。感谢您的帮助! - Michael Mangeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接