OSGi功能卸载工作正常,但仍然安装了捆绑包

编辑:用最新信息更新了这个问题... 我遇到了依赖功能背靠背“功能:卸载”命令的问题。 OSGi回应“状态正在改变......”,但通过接受其他请求,我们遇到了问题。 奇怪的是,这会导致功能卸载成功,但捆绑卸载失败。我们通过尝试适当地订购卸载请求并在步骤之间添加延迟来解决这个问题,但我希望有一个更强大的解决方案。 正如所建议的那样,我也尝试在步骤之间添加“osgi:refresh”......同样的行为。是否有另一种方法可以检测“刷新包”是否仍在运行以延迟后续请求等? 这是详细信息...... karaf @ root>功能:卸载PolicyUtil karaf @ root>功能:卸载Policy1 karaf @ root>功能:卸载Policy2 通过线程“刷新包”状态更改捆绑包“file:/policy2.jar”的进度。 karaf @ root>功能:卸载Policy3 通过线程“刷新包”状态更改捆绑“file:/policy3.jar”的进度。 karaf @ root>功能:卸载Policy4 karaf @ root>功能:卸载Enabler1 通过线程“刷新包”状态更改捆绑“file:/enabler1.jar”的进度。 karaf @ root>功能:卸载Enabler2 通过线程“刷新包”修改bundle“file:/enabler2.jar”的进度状态。 之后...我们最终安装了未安装的功能(正确),但仍安装了一些软件包(不正确) OSGi的:列表 [277] [已安装] [] [] [60]政策2 [278] [已安装] [] [] [60]政策3 [280] [已安装] [] [] [60]启用1 [281] [已安装] [] [] [60]启用2 特点:列表 [uninstalled] [1.0] PolicyUtil repo-0 [uninstalled] [1.0] Policy1 repo-0 [uninstalled] [1.0] Policy2 repo-0 [uninstalled] [1.0] Policy3 repo-0 [uninstalled] [1.0] Enabler1 repo-0 [uninstalled] [1.0] Enabler2 repo-0     
已邀请:
我不确定你会得到什么样的异常,但是你应该知道一件事:当你使用像
osgi:uninstall
这样的shell命令卸载一个bundle时,你实际上会调用
Bundle.uninstall()
。正如你可以在那里阅读Javadoc,这不是整个故事。 该框架支持对框架其余部分影响最小的操作,因此它可以在不删除所有相关软件包的情况下卸载软件包。如果你真的想删除所有这些,你应该使用
osgi:refresh
命令。有关此内容的更多信息,请参阅Felix常见问题解答。 我能给出的最好建议是不发出多个可以相互交叉的
uninstall
请求。如果你想删除一组包,我会发出非交叉
uninstall()
请求,然后是一个
refreshPackages()
。另外,我不会在单个系统中使用“常规”控制台和Karaf混合捆绑管理。 您还可以考虑使用外部管理器来安装和删除软件包。如果你想要远程管理,你可以选择Apache ACE(披露:我是Apache ACE提交者)。     
Oor ...你可以使用这个命令简单地卸载你的应用程序: karaf 2.2.x: osgi:卸载--force yourapp-feature / 0.0.1.SNAPSHOT     
好吧,我一直在深入研究这个问题,我想我理解这个问题和选项......感谢您的回复。 执行“features:uninstall [name]”时,它会调用bundle.uninstall(),然后调用features中每个bundle的refreshPackages()。然后,在卸载所有bundle之后,它会为所有bundle调用refreshPackages()。问题是refreshPackages()是异步的(根据OSGi规范)并使bundle处于解析状态。卸载解析功能/捆绑包的后续请求无法按预期完成。 如果卸载之间有足够的延迟,或者执行了稍后的卸载(在refreshPackages()完成之后)......一切都按预期工作。 选项... 卸载期间依赖于订单的功能/捆绑(难以控制) 在卸载命令之间延迟(不完全) 验证预期的功能/捆绑包是否已卸载(或继续等待) 侦听FrameworkEvent.PACKAGES_REFRESHED事件(复杂且无法保证,因为事件是容器范围的,请参阅此示例) 修改Karaf / Felix以支持同步刷新包的选项(请参阅本期/ Karaf 2.1.3的解决方案)     
根据我的经验,当捆绑包的资源仍然被另一个捆绑包引用或使用时,会发生这种情况。在这种情况下,框架无法删除捆绑包,整个jar文件仍由VM处理。 查看并确保删除所有引用。一个常见错误仍然是在bundle中实例化的一个对象中运行线程。这也算作仍在使用的资源广告,无法删除。     
在我的情况下,我已卸载该功能,并注意到挂包数,然后关闭karaf(3.x)。然后我删除了文件夹[karaf-install] / data / cache / [hanging-bundle-number]的子文件夹。 现在我重新启动karaf并且捆绑包战争没有显示在bundle:列表中。     

要回复问题请先登录注册