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:
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://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负