编辑:用最新信息更新了这个问题...
我在依存功能的背靠背运行“ features:uninstall”命令时遇到问题。 OSGi回复“状态更改正在进行中...”,但是通过接受其他请求,我们遇到了问题。
奇怪的是,这导致功能部件卸载成功,但捆绑软件卸载失败。我们通过尝试适当地订购卸载请求并在步骤之间增加延迟来解决此问题,但是我希望有一个更强大的解决方案。
根据建议,我还尝试在步骤之间添加“ osgi:refresh” ...相同的行为。有没有其他方法可以检测到“刷新包”仍在运行以延迟后续请求等?
这是详细信息...
karaf @ root>功能:卸载PolicyUtil
karaf @ root>功能:卸载Policy1
karaf @ root>功能:卸载Policy2
通过线程“刷新包”对捆绑包“文件:/policy2.jar”进行状态更改。
karaf @ root>功能:卸载Policy3
通过线程“刷新包”对捆绑包“ file:/policy3.jar”进行状态更改。
karaf @ root>功能:卸载Policy4
karaf @ root>功能:卸载Enabler1
线程“刷新包”对捆绑包“文件:/enabler1.jar”的状态更改正在进行中。
karaf @ root>功能:卸载Enabler2
线程“刷新包”对捆绑包“文件:/enabler2.jar”的状态进行中。
之后...我们最终卸载了功能(正确),但仍然安装了某些捆绑软件(错误)
osgi:列表
[277] [已安装] [] [] [60] Policy2
[278] [已安装] [] [] [60] Policy3
[280] [已安装] [] [] [60]启动器1
[281] [已安装] [] [] [60]启动器2
特点:清单
[未安装] [1.0] PolicyUtil repo-0
[未安装] [1.0] Policy1 repo-0
[未安装] [1.0] Policy2 repo-0
[未安装] [1.0] Policy3 repo-0
[未安装] [1.0] Enabler1 repo-0
[未安装] [1.0] Enabler2 repo-0
最佳答案
我不确定会收到哪种异常,但是您应该意识到一件事:使用诸如osgi:uninstall
之类的shell命令卸载捆绑软件时,您实际上会调用Bundle.uninstall()
。正如您可以在Javadoc中阅读的一样,这还不是全部。
该框架支持对框架其余部分影响最小的操作,因此它可以卸载捆绑软件而无需删除所有相关软件包。如果确实要删除所有它们,则应使用osgi:refresh
命令。有关此的更多信息,请参见Felix FAQ。
我能提供的最佳建议是不要发出多个可能相互交叉的uninstall
请求。如果要删除一组捆绑软件,则将触发非交叉的uninstall()
请求,然后触发单个refreshPackages()
。另外,我不会在单个系统中混合使用“常规”控制台和Karaf进行捆绑管理。
您也可以考虑使用外部管理器来安装和删除捆绑软件。如果您要进行远程管理,则可以使用Apache ACE(公开:我是Apache ACE提交者)。