OSGi是基于Java的服务平台的规范,本质是将Java面向对象的开发转向面向组件和服务的开发,具有服务组件模块化,动态加载应用等特点。Equinox 则是Eclipse所使用的OSGi框架,是Eclipse强大的插件体系的基础,是Eclipse著名的PDE开发环境的底层,Eclipse的稳定可靠性也为该框架带来了声誉。
Equinox是EclipseRT工程的一部分,为Eclipse提供基于OSGi的运行时环境。从代码的角度来看,Equinox不仅是OSGi R4核心标准规范的实现,它还借助Eclipse环境的一些自身的特点,提供了扩展OSGi R4提供的Bundle,以及运行基于OSGi的系统的基础架构。
本篇文章中我们从单个的eclipse入手,提取一个后台以命令行方式运行的Equinox容器。
首先,我们需要一个PDE版本的eclipse,这里以eclipse-indigo(3.7)作介绍。在PDE版本的eclipse中所有的插件都是在eclipse/plugins目录下。
新建文件夹用于存放所有的equinox容器中的文件,这里命名为equinox-sample-3.7,其中建立configuration(存放容器配置文件)和plugins(存放容器中的所有插件)子文件夹。
plugins文件夹中存放所有的系统启动必须的bundle,后续如果想要在这里存放bundle也可以直接放在该目录下,当前系统中所有必须的bundle列表如下:
configuration文件夹中建立config.ini文件,用于启动bundle的基本配置,配置的基本内容如下:
osgi.framework=file\:plugins\org.eclipse.osgi_3.7.2.v20120110-1415.jar
osgi.parentClassloader=ext
eclipse.ignoreApp=true
osgi.noShutdown=true
osgi.clean=true
osgi.console=
org.osgi.framework.system.packages=javax.naming, javax.naming.directory, javax.naming.spi, javax.management, javax.management.loading, javax.management.modelmbean, javax.net, javax.net.ssl, javax.crypto, javax.crypto.interfaces, javax.crypto.spec, javax.security.auth, javax.security.auth.spi, javax.security.auth.callback, javax.security.auth.login, javax.security.cert, javax.xml.parsers, javax.xml.xpath, javax.xml.transform.sax, javax.xml.transform.dom, javax.xml.namespace, javax.xml.transform, javax.xml.transform.stream, javax.xml.validation, org.xml.sax, org.xml.sax.helpers, org.xml.sax.ext, com.sun.org.apache.xalan.internal, com.sun.org.apache.xalan.internal.res, com.sun.org.apache.xml.internal.utils, com.sun.org.apache.xpath.internal, com.sun.org.apache.xpath.internal.jaxp, com.sun.org.apache.xpath.internal.objects, com.sun.org.apache.xml.internal, org.w3c.dom, org.w3c.dom.traversal, org.w3c.dom.ls, javax.sql, javax.transaction, sun.misc
org.osgi.framework.bootdelegation=*
osgi.bundles.defaultStartLevel=4
osgi.bundles=reference\:file\:org.eclipse.equinox.registry_3.5.101.R37x_v20110810-1611.jar@start,\
reference\:file\:org.eclipse.equinox.common_3.6.0.v20110523.jar@start,\
reference\:file\:org.eclipse.osgi.services_3.3.0.v20110513.jar@start,\
reference\:file\:org.eclipse.equinox.ds_1.3.1.R37x_v20110701.jar@start,\
reference\:file\:org.eclipse.equinox.util_1.0.300.v20110502.jar@start,\
reference\:file\:org.eclipse.equinox.preferences_3.4.2.v20120111-2020.jar@start
|
其中最重要的配置项就是osgi.bundles,其中定义了引用的bundle文件,以相对路径的方式引用plugins文件夹中的内容;org.osgi.framework.system.packages定义jdk中的扩展jar包,否则在equinox容器运行时会出现找不到对应的这些类似javax开头的class错误。本文中定义的属性都可以在实现bundle中通过System.getProperty获得。
建立完成后,我们需要写一下windows下运行的start.bat脚本:
java -jar plugins\org.eclipse.osgi_3.7.2.v20120110-1415.jar -configuration configuration -console -Xms40m -Xmx512m
以及Linux下运行的shell脚本:
java -jar plugins\org.eclipse.osgi_3.7.2.v20120110-1415.jar -configuration configuration -console -Xms40m -Xmx512m
具体的环境信息可以查看: https://github.com/clamaa/equinox-sample-3.7
windows下进行start.bat脚本的验证:
此时就可以使用equinox容器的基本命令与容器中的bundle进行操作了。
Equinox的控制台的部分基本命令如下(区分大小写):
install [URL] | 将URL表示的bundle安装到框架中 |
uninstall [bundleID] | 将id=bundleID的bundle卸载 |
start [bundleID] | 启动一个bundle |
stop [bundleID] | 停止一个bundle |
refresh [bundleID] | 刷新bundle |
update [bundleID] | 更新bundle 的内容 |
ss | 简单显示所有bundle的状态 |
status | 展示安装的bundle和注册的服务 |
headers [bundleID] | 展示bundle 的manifest中的元数据 |