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

Java 如何在运行时清理OSGi捆绑包缓存,java,osgi,osgi-bundle,Java,Osgi,Osgi Bundle,我有以下示例场景。。。(请注意,我可以使用服务实现场景,但我正在尝试一些事情) 一个OSGi捆绑包,包含一个Activator类(将其命名为“client”),另一个OSGi捆绑包是一个简单的库(将其命名为“server”),公开了一个名为callMe()的方法。在“client”的start()方法中,有一个对“server”的callMe()方法的调用。当然,“服务器”包公开了包含callMe()方法的类的包,“客户端”包将其作为导入包。 在没有安装两个bundle的情况下启动OSGi框架,

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

一个OSGi捆绑包,包含一个Activator类(将其命名为“client”),另一个OSGi捆绑包是一个简单的库(将其命名为“server”),公开了一个名为callMe()的方法。在“client”的start()方法中,有一个对“server”的callMe()方法的调用。当然,“服务器”包公开了包含callMe()方法的类的包,“客户端”包将其作为导入包。 在没有安装两个bundle的情况下启动OSGi框架,首先安装“客户端”bundle,当我尝试执行start()方法时,会显示以下错误:

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

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

之后,我卸载了“服务器”包,离开了“客户机”。奇怪的是现在。。。停止“客户端”并重新启动它。。。“客户”有效!它能够调用“server”的callMe()方法,即使我以前卸载过它!我知道OSGi框架有一个bundle缓存,所以“server”bundle似乎在缓存中,但为什么它没有显示在bundles列表中呢

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


Paolo.

当一个包进入解析状态时,OSGi构建到所需包的布线。然后,它将保留这些布线,直到调用刷新

因此,卸载服务器捆绑包时,客户端保持工作状态是完全正常的

调用refresh时,将再次执行解决步骤。因此,此时客户端无法解决问题。据我所知,配线没有缓存在磁盘上

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

我刚刚看到,使用“刷新”命令,我们可以强制OSGi框架重新检查捆绑包及其“已解决”状态。如果我调用“刷新”,我认为“客户端”捆绑包将从“活动”状态更改为“已安装”状态,因为“服务器”捆绑包现在已丢失。如果我现在为“客户机”调用start,它会失败,因为“服务器”不再存在。看起来它现在不在缓存中。。。是这样吗?