【发布时间】:2015-12-12 14:32:20
【问题描述】:
我有以下示例场景...(请注意,我可以使用服务来实现该场景,但我正在尝试一些事情)
一个带有 Activator 类(命名为“客户端”)的 OSGi 包和另一个作为简单库(命名为“服务器”)的 OSGi 包,公开了一个名为 callMe() 的方法。在“客户端”的 start() 方法中,调用了“服务器”的 callMe() 方法。当然,“服务器”包暴露了我们拥有带有 callMe() 方法的类的包,而“客户端”包将其作为导入包。 在没有安装两个包的情况下启动 OSGi 框架,我首先安装“客户端”包,当我尝试执行 start() 方法时,显示以下错误:
org.osgi.framework.BundleException:捆绑包org.example.helloworld [4]中未解决的约束:无法解决4.0:缺少要求[4.0] osgi.wiring.package; (osgi.wiring.package=org.example.helloworldlib)
这是正确的,因为“服务器”包既没有安装也没有解析。 现在,我安装“服务器”包并在“客户端”上调用 start():这一次一切正常,因为安装了“服务器”包,因此可以解析、激活“客户端”并且它可以调用 callMe() 方法“服务器”。
之后,我卸载了“服务器”捆绑包,留下了“客户端”。奇怪的是现在......停止“客户端”并重新启动()它......“客户端”工作!即使我之前卸载它也可以调用“服务器”的 callMe() 方法!我知道 OSGi 框架有一个包缓存,所以似乎“服务器”包在缓存中,但为什么它没有显示在包列表中?
是否可以在运行时清理缓存?
保罗。
【问题讨论】:
-
我刚刚看到,使用“刷新”命令,我们可以强制 OSGi 框架重新检查捆绑包及其“已解决”状态。如果我调用“刷新”,我认为“客户端”包从“活动”变为“安装”状态,因为“服务器”包现在丢失了。如果我现在为“客户端”调用 start 它会失败,因为“服务器”不再存在。现在好像不在缓存中了……对吗?
标签: java osgi osgi-bundle