把写好的bundle加载到equinox中,有以下几种方法
前两种方法装一两个还行,当你的bundle很多时,生活就无趣了,第三种方法还不错,只是自动加载的bundle没有被start,我们还是需要 一个个手动去start,当然网上也有介绍通过自定义bundle把没有启动的bundle启动起来,这确实也是一种解决方案。
再介绍另一种启动方式,细心的读者会发现org.eclipse.osgi bundle的描述符文件定义了一个启动类
Main-Class: org.eclipse.core.runtime.adaptor.EclipseStarter
这个类其实就是equinox容器的启动器,利用这个类我们可以通过代码增强实现org.eclipse.update.configurator的效果,部分代码片段如下:
/**
* 启动指定目录下的bundles
* @param bundlesPath bundles 所在的路径
*/
public void launch(String bundlesPath) throws Exception {
String bundles = searchBundles(bundlesPath);
setFrameworkProperties(bundles);
EclipseStarter.run(new String[] {}, null);
}
/**
* 查找指定目录下的bundles,最终会赋给osgi.bundles属性
*/
private String searchBundles(String bundlesPath) {
File bundlesDirectory = new File(bundlesPath);
if (!bundlesDirectory.exists() || !bundlesDirectory.isDirectory()) {
throw new IllegalArgumentException(“路径无效”);
}
File[] bundles = bundlesDirectory.listFiles();
StringBuilder bundlesBuilder = new StringBuilder();
for (File bundle : bundles) {
if (!bundle.isFile()) {
continue;
}
bundlesBuilder.append(bundle.getAbsolutePath() + “@start,”);
}
// 去掉最后一个逗号
bundlesBuilder.deleteCharAt(bundlesBuilder.length() – 1);
return bundlesBuilder.toString();
}
// 设置容器运行时参数
private void setFrameworkProperties(String bundles) {
// 以下配置项等同于config.ini中的配置
FrameworkProperties.setProperty(“osgi.noShutdown”, “true”);
FrameworkProperties.setProperty(“osgi.clean”, “true”);
FrameworkProperties.setProperty(“eclipse.ignoreApp”, “true”);
FrameworkProperties.setProperty(“osgi.bundles.defaultStartLevel”, “4″);
FrameworkProperties.setProperty(“osgi.bundles”, bundles);
}
最后运行一下,看看我们之前写的bundle能不能运行起来
public static void main(String[] args) throws Exception {
String bundlesPath = “D:/checkout/tools/osgi/plugins”;
new OsgiQuickLauncher().launch(bundlesPath);
}
输出结果如下:
HelloServiceConsumer activate
NO HelloService
setHelloService
HelloService
从以上结果可以看出,通过这种方式可以实现预期效果,不需要手动去install,也不需要手动去start,很轻松很便捷。
同时也不得不叹服Equinox的强大!
看过HSF启动代码的同学会发现HSF容器也是这样启动的~~~