问题 使用OSGi实现自动更新


我想要做的是为我的代码创建一个“启动器”框架,给定一个URL和一个预定义的版本控制方案: 1)去检查是否存在更新 2)下载更新 3)“安装”更新 4)“重新运行”应用程序

我想a)在现有JVM内部完成所有这些工作,b)独立于平台。高阶对吗?基于我对OSGi和Apache Felix的(有限)知识,我很确定这是可能的,但我真的迷失在细节中。

检查更新并下载它是微不足道的。导致“旧”捆绑卸载和“新”捆绑加载是我陷入困境的地方。我过去做过OSGi的工作,但它的动态远不如此。一个好的起点或朝着正确方向的努力将是最受欢迎的。

如果我真的过度烘焙已经用免费图书馆解决的东西,那么告诉我这个,但到目前为止我还没有找到任何东西。 :-)


7588
2017-08-17 17:48


起源



答案:


您甚至不需要下载它,只需检查更新是否可用,然后在需要更新的包上调用Bundle.update(InputStream),之后通常调用PackageAdmin.refreshPackages()。


7
2017-08-17 17:59



这会导致以前的捆绑解除绑定吗?更新后(即在硬盘驱动器上)现有捆绑包会发生什么? - user453385
理查德的回答简明扼要,请参阅 osgi.org/javadoc/r4v43/org/osgi/framework/...  - (旧)捆绑包的状态将更改为UNINSTALLED,在这种情况下,它将不再可用。不确定每个框架的作用 - 它们肯定会在重新启动之间保留捆绑包,我想象一个完全删除了已卸载的bundle(只要垃圾收集不受阻止,都来自JVM,以及磁盘缓存)。 OSGi非常适合您的需求,如果灵活可以通过maven repo和pax mvn url处理程序完成 - earcam
刷新导致旧包“解除绑定”并可用于垃圾回收。更新后,硬盘驱动器和内存中的软件包有两个版本,假设其他软件包对更新的软件包有依赖关系。这就是必须进行刷新的原因,因为您希望任何依赖包都切换到新版本。一旦刷新发生,那么在内存或磁盘上只有一个更新的包的修订版。 - Richard S. Hall
如果更新失败怎么办?或者如果更新成功但有运行时错误以保证回滚会怎么样?我认为发布一个回滚包作为一个新的更新将很好。 - Augustus Thoo


答案:


您甚至不需要下载它,只需检查更新是否可用,然后在需要更新的包上调用Bundle.update(InputStream),之后通常调用PackageAdmin.refreshPackages()。


7
2017-08-17 17:59



这会导致以前的捆绑解除绑定吗?更新后(即在硬盘驱动器上)现有捆绑包会发生什么? - user453385
理查德的回答简明扼要,请参阅 osgi.org/javadoc/r4v43/org/osgi/framework/...  - (旧)捆绑包的状态将更改为UNINSTALLED,在这种情况下,它将不再可用。不确定每个框架的作用 - 它们肯定会在重新启动之间保留捆绑包,我想象一个完全删除了已卸载的bundle(只要垃圾收集不受阻止,都来自JVM,以及磁盘缓存)。 OSGi非常适合您的需求,如果灵活可以通过maven repo和pax mvn url处理程序完成 - earcam
刷新导致旧包“解除绑定”并可用于垃圾回收。更新后,硬盘驱动器和内存中的软件包有两个版本,假设其他软件包对更新的软件包有依赖关系。这就是必须进行刷新的原因,因为您希望任何依赖包都切换到新版本。一旦刷新发生,那么在内存或磁盘上只有一个更新的包的修订版。 - Richard S. Hall
如果更新失败怎么办?或者如果更新成功但有运行时错误以保证回滚会怎么样?我认为发布一个回滚包作为一个新的更新将很好。 - Augustus Thoo


您可以检查众所周知的配置解决方案,它可以代替您执行所有步骤(检查新版本,下载,安装/更新,重新启动等)

  1. 对于Equinox框架:p2 http://www.eclipse.org/equinox/p2/
  2. 对于任何OSGi R4框架:Apache ACE http://incubator.apache.org/ace/a-brief-introduction.html

最好的祝福, 德米特罗


4
2017-08-18 05:06