OSGi-开发环境的建立和HelloWorld(04)
1 OSGi开发环境的建立
1.1 Equinox是什么
从代码角度来看,Equinox其实就是OSGi核心标准的完整实现,并且还在这个基础上增加了一些额外的功能(比如为框架增加了命令行和程序执行的入口)。我们在之前入门篇讲解的都东西其实都是OSGi核心标准的一小部分。其实它的核心就是一个jar包,这个jar包既能执行(作为标准Java包的特性),也是一个bundle(Manifest里面含有OSGi bundle特有的元数据)。
我们能够利用Equinox项目的代码来运行一个实实在在的OSGi框架,框架启动后,你就可以将你开发好bundle放到里面运行。
1.2 下载Equinox
Equinox在http://download.eclipse.org/equinox上有官方下载,里面列出了各个版本供我们选择:
在这里,我们使用3.7版本的Equinox,下载好以后放在一个单独的文件夹下(这里我的路径是D:\develop-tools):
1.3 从命令行启动框架
如果启动这个框架的话,有了上面的jar包就足够了,我们进入命令行输入如下命令:java –jar org.eclipse.osgi_3.7.2.v20120110-1415.jar -console ,然后就会进入Equinox的控制台:
如果出现osgi>的提示符,就说明启动成功了。
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中的元数据 |
1.4 在Eclipse中建立开发环境
1.4.1 设置
进入Eclipse的window-->preferences-->Plug-in Development-->Target Platform:
初始状态只有一个Runing Platform, 点击“Add…”按钮来增加一个我们自己的的platform,进入如下界面:
选择默认的第一个就好,点击next;
再点击这里的“Add…”;
选择Directory;
选择你的Equinox的jar包所在的路径,然后点击finish,回到刚才的界面:
这时候你就会发现里面多出来了你刚刚设置的路径,路径后面描述的“1 plug-ins available”则就是说的我们放置的Equinox的jar包。
继续点击finish,回到最开始的界面:
这时候多出来了一个新的target platform,勾选上,然后确定。
1.4.2 启动
打开菜单项Run->Run configurations…,在OSGi Framework项中,新建一个Run configuration:
点击run按钮
Eclipse的控制台中也出现来了osgi的提示符,说明你已经成功启动了。
你可以试试刚才讲的那些命令,看看能输出些什么(比如上图中我输入了ss)。
1.4.3 新建一个project
打开新建project的界面,选择Plug-in Project:
然后输入project的名字,TargetPlatform处选择an OSGi framework->Equinox或者standard都行,点击下一步:
这里实际上是对bundle的Manifest文件的设置,其中的ID就是Bundle-SymbolicName,Version就是bundle的版本号,下面还能决定是否定义BundleActivator,点击finish就创建了一个project:
至此,开发环境已经建立完毕(这个project只是为了演示怎么建立,不会在接下来的内容中用到,可删之)。
2 HelloWorld
现在可谓是万事具备,只欠Helloworld了。为了将OSGi框架的三个层次都涵盖到,这个Helloworld可能会比其他你见到的OSGi Helloworld程序要复杂一点点。如果对代码中的一些API感到生疏,记得回到之前的入门篇中找到对应的内容,这样对你理解代码会有帮助。里面的关键代码已经用黄色高亮显示。(出于篇幅考虑,代码中的import语句都省略)
2.1 HelloWorld的定义与实现
首先我们创建一个工程HelloWorld,在这个工程里面,我们创建一个包含sayHello方法的接口,准备作为服务接口:
然后,对这个接口进行实现:
了将这个接口暴露出来,我们需要在MANIFEST文件中加入如下条目:
接下来,为了把这个服务注册到框架中,我们定义了一个Activator:
为这个HelloImpl传入了"Hello, OSGi"的字符串 为了让这个Activator能够工作,需要在MANIFEST文件中做如下定义:
Bundle-Activator: com.yangw.helloworld.activator.Activator
2.2 获得并执行SayHello服务
创建一个工程HelloClient,创建一个叫HelloUser的BundleActivator,其中的start方法会获得接口为Hello的服务对象,并且通过这个对象来调用sayHello方法:
为了获得Hello这个接口的定义,我们还需要在MANIFEST文件中import Hello所在的package:
![](data:image/png;base64,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)
2.3 HelloWorld程序的流程
下图表示了这几个类的各个功能的相互依赖关系,整个关系从Hello接口的定义开始;然后到Hello接口被实现,得到HelloImpl;再到Activator将HelloImpl注册为框架中的一个服务,再到HelloUser通过与框架交互得到刚才注册的服务,并且使用这个服务从而输出字符串;最后一个可选流程是当我们stop org.serc.helloworld这个bundle的时候,程序会将之前注册的服务注销掉。
2.4 程序的执行
通过上面的工作,我们得到了两个自己定义的bundle: org.serc.helloworld org.serc.helloworld.client 现在打开Run configurations界面,我们会看见Bundles标签里面多出来了这两个bundle:
run 即可,使用ss,start stop等命令即可看到效果
![](https://files.cnblogs.com/files/yangw/zfb_hongb.gif)
![](https://files.cnblogs.com/files/yangw/wx_s.gif)
![](https://files.cnblogs.com/files/yangw/zfb_s.gif)
未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负