梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

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等命令即可看到效果

 

 

 

posted on 2013-10-10 14:12  梦相随1006  阅读(1867)  评论(1编辑  收藏  举报