使用OSGi实现自动更新

11
我想创建一个“启动器”框架用于我的代码,给定一个URL和预定义的版本控制方案: 1)检查是否存在更新 2)下载更新 3)“安装”更新 4)“重新运行”应用程序
我希望a)所有这些都在现有JVM内完成,b)独立于平台。 基于我(有限的)对OSGi和Apache Felix的了解,我很确定这是可能的,但我在细节上迷失了方向。
检查更新并下载它很简单。让“旧”捆绑卸载并加载“新”捆绑,这是我卡住的地方。 我以前做过OSGi工作,但比这少得多。 最好提供一个起点或正确方向的硬推力量将不胜感激。
如果我正在严重加热已经使用免费库解决的问题,请告诉我,但到目前为止我还没有找到任何东西。 :-)
2个回答

7

您甚至不需要下载它,只需检查是否有更新,然后在需要更新的bundle上调用Bundle.update(InputStream)方法,通常紧随其后的是对PackageAdmin.refreshPackages()方法的调用。


这会导致先前的捆绑解除绑定,对于更新后的现有捆绑(即硬盘上的捆绑)会发生什么? - user453385
Richard的回答简洁明了,正确无误,请参见http://www.osgi.org/javadoc/r4v43/org/osgi/framework/Bundle.html#update%28java.io.InputStream%29 -旧bundle的状态将更改为UNINSTALLED,在这种情况下,它将不再可用。不确定每个框架都做什么-它们肯定会在重新启动时保留bundle,我想卸载的bundle将完全删除(从JVM中,只要垃圾收集没有受到阻碍,以及磁盘缓存)。 OSGi非常适合您的需求,如果灵活使用,则可以通过maven repo和pax mvn url处理程序来完成 - earcam
刷新操作会导致旧的 bundle "解除绑定" 并变得可供垃圾回收。在更新后,假设其他 bundle 依赖于已更新的 bundle,则硬盘和内存中会有两个版本的 bundle。这就是为什么需要进行刷新,因为您希望任何依赖 bundle 切换到新版本。一旦刷新发生,那么更新后的 bundle 在内存或磁盘上只有一个版本。 - Richard S. Hall
如果更新失败怎么办?或者更新成功了,但是运行时出现了错误需要回滚怎么办?我认为发布一个回滚捆绑包作为新的更新会很好。 - Augustus Thoo

4

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