2011-08-17 45 views
10

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

我想a)做现有的JVM的所有内部和b)是平台独立的。高高的顺序?基于我对OSGi和Apache Felix的(有限的)了解,我确信这是可能的,但我真的迷失在细节中。

检查更新并下载它是微不足道的。导致“旧”包卸载和“新”包加载是我卡住的地方。过去我已经完成了OSGi的工作,但是它的动态性比这更低。我们将非常感谢一个好的出发地或正确的方向。

如果我认真地过度烘烤已经用免费库解决的问题,请告诉我这一点,但到目前为止我还没有发现任何东西。 :-)

回答

6

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

+0

这将导致以前的捆绑包解除正确?更新后现有捆绑软件会发生什么情况(即在硬盘上)? – user453385

+0

Richard的答案简洁而正确,请参阅http://www.osgi.org/javadoc/r4v43/org/osgi/framework/Bundle.html#update%28java.io.InputStream%29 - (旧)包的状态将会将其更改为UNINSTALLED,在这种情况下,它不再可用。不知道每个框架都做了什么 - 它们肯定会在重新启动之间持有捆绑包,我想可以完全删除一个卸载的捆绑包(只要垃圾收集不受阻碍,以及磁盘缓存都从JVM中移除)。 OSGi非常适合您的需求,如果灵活性可以通过maven repo和pax mvn url处理程序完成 – earcam

+0

刷新会导致旧捆绑“解除绑定”并成为垃圾收集。更新后直接在硬盘驱动器和内存中对软件包进行两次修订,假定其他软件包依赖于更新后的软件包。这就是为什么刷新是必要的,因为您希望将任何从属软件包切换到新版本。一旦刷新发生,那么在内存或磁盘上只有一个修订版本的更新包。 –

相关问题