【问题标题】:Using OSGi to implement auto-update使用 OSGi 实现自动更新
【发布时间】:2011-10-29 03:46:10
【问题描述】:

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

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

检查更新并下载它是微不足道的。导致“旧”包卸载和“新”包加载是我卡住的地方。我过去做过 OSGi 的工作,但它的动态性远低于此。一个好的起点或朝着正确的方向努力将不胜感激。

如果我严重过度烘焙已经通过免费库解决的问题,那么也请告诉我,但到目前为止我还没有找到任何东西。 :-)

【问题讨论】:

    标签: java osgi auto-update


    【解决方案1】:

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

    【讨论】:

    • 这会导致之前的bundle解绑对吗?更新后(即在硬盘上)现有捆绑包会发生什么情况?
    • Richard 的回答简洁而正确,请参阅osgi.org/javadoc/r4v43/org/osgi/framework/… - (旧)捆绑包的状态将更改为 UNINSTALLED 在这种情况下不再可用。不确定每个框架的作用-它们肯定会在重新启动之间保留捆绑包,我想一个已卸载的捆绑包被完全删除(只要垃圾收集不受阻碍,就从 JVM 以及磁盘缓存中删除)。 OSGi 非常适合您的需求,如果灵活的话,只需使用 maven repo 和 pax mvn url 处理程序即可完成
    • 刷新会导致旧包“解除绑定”并可以用于垃圾回收。更新后,硬盘驱动器和内存中的捆绑包有两个修订版,假设其他捆绑包依赖于更新的捆绑包。这就是为什么需要刷新的原因,因为您希望任何依赖包切换到新版本。一旦发生刷新,那么无论是在内存中还是在磁盘上,都只有一个更新包的修订版本。
    • 更新失败怎么办?或者如果更新成功但有运行时错误需要回滚怎么办?我认为将回滚包作为新更新发布会很好。
    【解决方案2】:

    您可以查看可以代替您完成所有步骤的知名供应解决方案(检查新版本、下载、安装/更新、重启等)

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

    最好的问候, Dmytro

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2011-04-22
      • 2015-06-13
      • 1970-01-01
      • 2011-05-15
      • 2010-12-09
      • 2011-12-03
      相关资源
      最近更新 更多