欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OSGi一小步-快速启动Equinox 博客分类: OSGi bundleosgieclipseequinoxinstall 

程序员文章站 2024-03-19 13:31:22
...

把写好的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容器也是这样启动的~~~