如何在运行时清理 OSGi 包缓存
How to clean OSGi bundles cache at runtime
我有以下示例场景...(请注意,我可以使用服务实现该场景,但我正在尝试一些事情)
一个带有激活器的 OSGi 包 class(命名为 "client")和另一个 OSGi 包,它是一个简单的库(命名为 "server"),公开了一个名为 callMe() 的方法. "client" 的 start() 方法调用了 "server" 的 callMe() 方法。当然,"server" 包暴露了我们有 class with callMe() 方法的包,而 "client" 包将它作为导入包。
在没有安装两个包的情况下启动 OSGi 框架,我先安装 "client" 包,当我尝试执行 start() 方法时,显示以下错误:
org.osgi.framework.BundleException:束中未解决的约束 org.example.helloworld [4]:无法解决 4.0:缺少要求 [4.0] osgi.wiring.package; (osgi.wiring.package=org.example.helloworld库)
这是正确的,因为 "server" 包既没有安装也没有解析。
现在,我安装 "server" bundle 并在 "client" 上调用 start() :这次一切正常,因为 "server" bundle 已安装,因此 "client" 可以被解析、激活和它可以在 "server".
上调用 callMe() 方法
之后,我卸载了 "server" 捆绑包,留下了 "client"。现在奇怪的是......停止 "client" 并重新启动()它...... "client" 有效!即使我之前卸载它,它也能调用 "server" 的 callMe() 方法!我知道 OSGi 框架有一个包缓存,所以 "server" 包似乎在缓存中,但为什么它没有显示在包列表中?
是否可以在运行时清理缓存?
保罗.
当捆绑包进入已解决状态时,OSGi 构建到所需包的连接。然后它会保留这些接线,直到调用刷新。
所以当您卸载服务器包时,客户端继续工作是完全正常的。
当您调用刷新时,解析步骤将再次完成。所以此时客户端无法解析。据我所知,接线没有缓存在磁盘上。
所以如果你卸载服务器并重启框架客户端应该也会解析失败
我有以下示例场景...(请注意,我可以使用服务实现该场景,但我正在尝试一些事情)
一个带有激活器的 OSGi 包 class(命名为 "client")和另一个 OSGi 包,它是一个简单的库(命名为 "server"),公开了一个名为 callMe() 的方法. "client" 的 start() 方法调用了 "server" 的 callMe() 方法。当然,"server" 包暴露了我们有 class with callMe() 方法的包,而 "client" 包将它作为导入包。 在没有安装两个包的情况下启动 OSGi 框架,我先安装 "client" 包,当我尝试执行 start() 方法时,显示以下错误:
org.osgi.framework.BundleException:束中未解决的约束 org.example.helloworld [4]:无法解决 4.0:缺少要求 [4.0] osgi.wiring.package; (osgi.wiring.package=org.example.helloworld库)
这是正确的,因为 "server" 包既没有安装也没有解析。 现在,我安装 "server" bundle 并在 "client" 上调用 start() :这次一切正常,因为 "server" bundle 已安装,因此 "client" 可以被解析、激活和它可以在 "server".
上调用 callMe() 方法之后,我卸载了 "server" 捆绑包,留下了 "client"。现在奇怪的是......停止 "client" 并重新启动()它...... "client" 有效!即使我之前卸载它,它也能调用 "server" 的 callMe() 方法!我知道 OSGi 框架有一个包缓存,所以 "server" 包似乎在缓存中,但为什么它没有显示在包列表中?
是否可以在运行时清理缓存?
保罗.
当捆绑包进入已解决状态时,OSGi 构建到所需包的连接。然后它会保留这些接线,直到调用刷新。
所以当您卸载服务器包时,客户端继续工作是完全正常的。
当您调用刷新时,解析步骤将再次完成。所以此时客户端无法解析。据我所知,接线没有缓存在磁盘上。
所以如果你卸载服务器并重启框架客户端应该也会解析失败