Karaf如何无需重装bundle即可生效features.xml的配置修改
Karaf修改features.xml的bundle Wrap配置自动生效方案
问题场景
在features.xml中调整自定义bundle配置,通过Pax URL Wrap实现依赖动态导入,原配置为:
<bundle start-level='78'>mvn:abc.def/aid/1.1</bundle>
修改后的配置为:
<bundle start-level='78'>wrap:mvn:abc.def/aid/1.1\$DynamicImport-Package=*&overwrite=merge;</bundle>
在Karaf控制台手动执行卸载、带Wrap参数重装的命令可以验证配置有效:
karaf@root> uninstall <aid对应的bundle id> karaf@root> install -s wrap:mvn:abc.def/aid/1.1\$DynamicImport-Package=*&overwrite=merge;
但手动卸载重装的操作不符合修改features.xml实现配置统一管理的预期,且尝试过重启Karaf、执行features:refreshurl、osgi:update、osgi:restart操作后,新配置都无法自动应用。
失效原因
Karaf的Features服务对已安装的feature做校验时,默认只判断bundle的Maven坐标、版本号是否发生变化,不会识别bundle安装URL的协议前缀、附加参数改动。本次修改只是给原有mvn协议的bundle地址加了Wrap包装参数,bundle本身的坐标、版本完全没有变化,因此Karaf判定该bundle无需更新,不会自动重新部署。
操作步骤
按以下顺序执行操作,无需手动卸载重装aid bundle即可让配置生效:
- 第一步:刷新features仓库缓存,确保Karaf读取到最新的
features.xml内容features:refreshurl - 第二步:对aid所属的feature执行强制更新,注意不要使用bundle级别的
osgi:update命令,要使用feature维度的更新命令,携带-v参数强制更新关联的bundle配置:features:update -v <aid所属feature的名称> <对应feature的版本号>如果不清楚feature的准确名称和版本,可先执行
features:list | grep <feature关键词>查询匹配结果。 - 第三步:校验生效状态,执行
bundle:list | grep aid确认bundle为Active状态,再执行bundle:info <aid的bundle id>查看导入配置,能看到DynamicImport-Package: *配置项即代表修改生效。
如果执行上述操作后配置仍未生效,是因为Karaf本地缓存了旧的解析结果,停掉Karaf进程后删除karaf/data/cache目录下的全部内容,再重启Karaf即可,启动过程中Karaf会按照最新的features.xml配置重新部署所有bundle。
内容的提问来源于stack exchange,提问作者greenTea
相关产品推荐
相关产品推荐

