您的位置:首页 > 其它

OSGi起步(1):第一个Bundle

2007-08-14 09:14 274 查看
最近决定尝试翻译一些简单的文章。
---------------------------------
原文出处:http://www.eclipsezone.com/eclipse/forums/t90365.html
原作者:Neil Bartlett
Blog http://neilbartlett.name/blog/osgi-articles/ ---------------------------------

OSGi起步:第一个Bundle

在接下去的一到两周内,EclipseZone将发表一系列关于OSGi的短文。它们将指引读者走上掌握OSGi编程的道路。每一篇短文将只介绍一个技术原点,并且在十分钟内介绍完毕。而且,为了想向读者展示OSGi编程可以多么简单,我们将不使用Eclipse开发,而只使用文本编辑器以及最基本的命令行工具。

那么,欢迎来到“OSGi起步”。

事实上,第一篇短文将比这个系列的其他文章要长一些,因为我们需要先设置最基本的工作环境。首先我们需要一个OSGi框架。目前有三个开源的OSGi框架:Apache Felix,Knopflerfish和Enquinox。虽然接下来我们要写的代码与所选择的框架没有关系,但是,不同框架运行的指令还是有所区别的。因为这里是EclipseZone(Eclipse园地),所以我们使用Eclipse所使用的Equinox。你可以从Eclipse的安装目录中得到一个拷贝:找到文件org.eclipse.orgi_3.2.1.R32x_v20060919.jar并复制到一个空目录中(该文件的版本号字符串可能会因为你所使用的Eclipse的版本不同而有所不同)。如果你找不到的话,也可以从网上下载,网址是http://download.eclipse.org/eclipse/equinox/

为了让命令短一些,我们把文件重命名为equinox.jar.。现在,打开命令行窗口,执行以下命令:


java –jar equinox.jar –console

不一会,屏幕上将出现 osgi> 的提示符。恭喜你,OSGi运行起来了!

通过 osgi> 提示符,我们可以输入一些命令来控制OSGi框架。你可以输入help来查看相关命令列表,尝试一下吧。完成了么?好,现在,输入ss,这是最常用的一个命令,它代表 “short status”(简洁状态),用于显示所有已经安装的bundle和它们的当前状态。(bundle在OSGi术语中表示一个模块。如果你是一个Eclipse开发人员,你应该知道plug-in,bunlde和plugin基本上是一样的东西)。

输入ss命令后,Equinox将输出以下内容:


Framework is lanuched.








id State Bundle




0 ACTIVE system.bundle_3.2.1.R32x_v20060919



这表示当前已经安装了一个bundle,并且它处于活动状态。事实上,这个bundle是系统bundle。它是OSGi中的一个特殊bundle,它一直都存在,代表OSGi框架本身。

现在我们来写我们自己的bundle。在刚才相同目录下,创建文件HelloActivator.java,然后把以下内容复制到文件里:


import org.osgi.framework.*;






public class HelloActivator implements BundleActivator ...{






public void start(BundleContext context) ...{




System.out.println("Hello EclipseZone Readers!");




}






public void stop(BundleContext context) ...{




System.out.println("Goodbye EclipseZone Readers!");




}




}






每个bundle还需要一个manifest文件来描述它的元数据,比如它的名字、版本等等。创建文件HelloWorld.mf,复制以下内容到文件中。注意,该文件需要以一个空行作为结尾,否则jar命令会把文件截短(truncate):


Manifest-Version: 1.0


Bundle-Name: HelloWorld


Bundle-Activator: HelloActivator


Bundle-SymbolicName: HelloWorld


Bundle-Version: 1.0.0


Import-Package: org.osgi.framework



为了保持OSGi运行,我们重新打开一个命令行窗口,然后用以下命令创建一个jar包:


javac -classpath equinox.jar HelloActivator.java




jar -cfm HelloWorld.jar HelloWorld.mf HelloActivator.class



好了,返回刚才的OSGi控制台,输入:install file:HelloWorld.jar。正常的话,应该返回“Bundle id is 1”。再次输入ss,你应该能看见以下内容:


Framework is launched.






id State Bundle




0 ACTIVE system.bundle_3.2.1.R32x_v20060919




1 INSTALLED HelloWorld_1.0.0



这样,我们的HelloWorld bundle就安装好了。不过,它还没处于活动状态。在下一篇文章中,我们将看到这些状态都表示什么意思。
现在,我们只需要把它启动起来,输入命令 start 1。这个“1”就是第一列中显示的ID。
输入这个命令以后,我们将看到一个消息“Hello EclipseZone Readers!”。
再输入stop 1,将看到“Goodbye EclipseZone Readers”。
重复这些操作直到你厌烦为止(-_______-!)。注意通过命令ss来查看bundle的状态。

这个过程中发生了什么呢?我们的代码实现了接口BundleActivator,这样,框架会把bundle生命周期中的重要事件通知我们。框架在bundle启动时调用start方法,停止时调用stop方法。
另外,还要注意的是manifest文件中的“Bundle-Activator:HelloActivator”一行。它告诉框架哪个类是这个bundle的生命周期触发器(activator)。通常,这个名字是一个很完整的类名,这里我们为了偷懒而使用了默认的包。

好了,以上是我们的第一次安装bundle的过程。下次见。
---------回帖摘录 -----------------------
4.文章《Equinox快速向导》(Equinox QuickStart Guide http://www.eclipse.org/equinox/documents/quickstart.php) 介绍了如何配置Equinox以及如何在启动Equinox时自动启动你的Bundle。
6.(1)manifest文件可以任意命名。不过打包成Jar后,都会被更名为MANIFEST.MF。
(2)在manifest文件中,Bundle-Name字段是这个bundle的描述名,可以包含空格。但是Bundle-SymbolicName更像bundle的ID。它不允许包含空格,在Eclipse中,它通常和java的包名差不多,比如“org.eclipse.core.runtime”。
(3)每个bundle只能有0或者1个activator。当然,你可以有多个类实现BundleActivator接口,但是仅能有一个是它的Activator类。
7.事实上,通过Activator把其他实现了activator接口的类链接起来也挺简单的。比如,你可以在manifest文件中添加一个自定义的字段来实现,比如:


Alex-Other-Activators: com.foo.Bar, com.example.Other ...

然后在bundle的Activator中使用以下类似代码:




public void start(BundleContext context) ...{




String others = context.getBundle().getHeaders().




get("Alex-Other-Activators");




String[] activators = others.split(",");






for(int i;i=0;i<activators.length) ...{




// do something with activators[i]




}




}



当然,通常直接使用start方法作为代表会更加简单一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: