`
snoopy7713
  • 浏览: 1152565 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

OSGi一小步-快速启动Equinox

    博客分类:
  • OSGi
阅读更多

把写好的bundle加载到equinox中,有以下几种方法

  • 通过基本的install命令把bundle一个个装载进去
  • 在config.ini文件中配置需要装载的bundle,当equinox启动时会自动装载
  • 通过配置org.eclipse.update.configurator bundle自动加载你的bundle

前两种方法装一两个还行,当你的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容器也是这样启动的~~~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics