如何在运行时清理OSGi包缓存

时间:2015-12-12 14:32:20

标签: java osgi osgi-bundle

我有以下示例场景...(请注意我可以使用服务实现场景,但我正在尝试一些事情)

带有Activator类的OSGi包(将其命名为“client”)和另一个OSGi包,它是一个简单的库(将其命名为“server”),公开名为callMe()的方法。在“client”的start()方法中,调用“server”的callMe()方法。当然,“server”包暴露了我们拥有callMe()方法的类的包,“client”包将它作为导入的包公开。 在没有安装两个软件包的情况下启动OSGi框架,我首先安装“client”软件包,当我尝试执行start()方法时,会显示以下错误:

org.osgi.framework.BundleException:bundle org.example.helloworld [4]中未解决的约束:无法解析4.0:缺少需求[4.0] osgi.wiring.package; (osgi.wiring.package = org.example.helloworldlib)

这是正确的,因为既没有安装也没有解决“服务器”包。 现在,我安装“服务器”软件包并在“客户端”上调用start():这次一切正常,因为安装了“服务器”软件包,因此可以解析,激活“客户端”,并且可以调用callMe()方法“服务器”。

之后我卸载了“服务器”包,离开了“客户端”。奇怪的是现在......停止“客户端”并重新启动()它......“客户端”正常工作!它可以调用“server”的callMe()方法,即使我之前已经卸载它!我知道OSGi框架有一个捆绑缓存,所以似乎“服务器”捆绑包在缓存中,但为什么它没有在捆绑列表中显示?

是否可以在运行时清理缓存?

保罗。

1 个答案:

答案 0 :(得分:1)

当捆绑包进入解决状态时,OSGi会为所需的包构建连接。然后保持这些布线直到调用刷新。

因此,在卸载服务器软件包时,客户端始终正常工作是完全正常的。

当您调用refresh时,将再次执行resolve步骤。所以此时客户端无法解决。据我所知,接线没有缓存在磁盘上。

因此,如果卸载服务器并重新启动框架,客户端也应该无法解决。