OSGI插件更新

本文介绍如何在OSGi环境中利用PackageAdmin服务的refreshPackages方法来更新bundle。通过实现ServiceTrackerCustomizer接口创建一个服务跟踪器,并通过Activator类提供一个静态方法getPackageAdminInstance()来获取PackageAdmin实例,从而调用refreshPackages方法实现bundle的刷新。
摘要由CSDN通过智能技术生成
OSGI环境中 ,可以通过BundleContext 来获取环境中的bundle, 对bundle我们可以进行start,stop,uninstall,update; 安装可以通过bundleContext.install(路径);来安装; 但插件没有提供refresh的方法,在运行中的bundle通过update操作可能不会更新,安装补丁后,也需要刷新宿主,这样通过程序来控制得特殊处理;实际上提供了refresh方法,但比较不好找而已;
首先在你的Activator 中实现ServiceTrackerCustomizer接口
public class Activator implements BundleActivator, ServiceTrackerCustomizer  {

private ServiceTracker packageAdminTracker;

private static PackageAdmin packageAdmin;

private static BundleContext context;

public static BundleContext getContext() {
return context;
}

public static PackageAdmin getPackageAdminInstance() {
return packageAdmin;
}

public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
Activator.resumePluginRegistry = new ArrayList();

packageAdminTracker = new ServiceTracker(context, PackageAdmin.class.getName(), this);
packageAdminTracker.open();
}

public void stop(BundleContext bundleContext) throws Exception {
packageAdminTracker.close();
packageAdminTracker = null;
}

public Object addingService(ServiceReference reference) {
synchronized (Activator.class) {
packageAdmin = (PackageAdmin) context.getService(reference);
}
return packageAdmin;
}

public void modifiedService(ServiceReference reference, Object service) {
}

public void removedService(ServiceReference reference, Object service) {
synchronized (Activator.class) {
context.ungetService(reference);
packageAdmin = null;
}
}

}


实现一个跟踪器,这样在程序中可以通过
Activator.getPackageAdminInstance().refreshPackages(new Bundle[] { bundle });
来更新你的要更新的插件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值