使用 Equinox 开发 OSGi 应用程序(上)

本文大量参考了IBM Developerworks上的文章使用 Equinox 开发 OSGi 应用程序,之所以重新发表,是因为原文使用的是Eclipse 3.3,现在主流的版本为3.4,其中有些不同的地方。另外有一部分语焉不详,很容易使人卡在半途(主要在下一篇里)。因此我针对3.4做了一些整理,也重新截了图,作为对OSGi入门开发的一个小结。
OSGi中文的大部分资料都和BlueDavy有很大的关系。如果想对OSGi有一个入门性或者较为深入的理解,请参阅BlueDavy编写的OSGi实战和OSGi进阶的OpenDoc。本文假定读者对OSGi有一些了解,所以对OSGi的介绍就不再赘述。
对于Eclipse(3.2+)来说,其上运行的所有插件都是OSGi的Bundle。其核心Equinox就是OSGiR4的参考实现。所以,在Eclipse里,我们通过开发插件的形式,开发符合OSGi规范的Bundle。我们从HelloWorld开始。

  1. 建立一个 plug-in 工程,File > New > Project,选择 Plug-in development > Plug-in Project
    新建插件项目
    新建插件项目
  2. 在建立工程的第一个向导,填入工程的名称:osgi.test.helloworld,使用缺省的工程路径。由于我们的项目是一个通用的 OSGi bundle,所以选择 equinox。比3.3多出来的Working Set的概念我还没搞清楚,就默认吧。
    新插件项目设置
    新插件项目设置

  3. 这个步骤主要是填写插件/Bundle一些信息。可以不做修改直接“Next”。其中最后的是关于Activator的设置,相当于一个Java程序的main()入口,控制着整个Bundle的生命周期。与3.3相比,多出了Execution Environment选项。如果只在本机HelloWorld的话,就用默认的环境。
    新插件项目信息
    新插件项目信息
  4. 去掉所有的模板设置,结束新建newpluginprojectnotemplate
  5. 完成,切换到插件开发的视角。新建了osgi.test.helloworld.Activator类,用于控制Bundle的生命周期,初始化等等(不过初始化工作不必都放在这里,OSGi提供了完整了Listener的支持)。最重要的配置文件是MANIFEST.MF,Eclipse提供了完整的编辑器支持,有几个标签页。比如在Dependencies里设置导入的包和依赖的Bundle/Plugin,Runtime则配置了导出的包及其他信息。newpluginprojectfinish
  6. 编辑 Activator.java,找到start()方法,输入 hello world 语句,代码如下:
    package osgi.test.helloworld;
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    public class Activator implements BundleActivator {
    	/*
    	 * (non-Javadoc)
    	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
    	 */
    	public void start(BundleContext context) throws Exception {
    		System.out.println("hello world");
    	}
    	/*
    	 * (non-Javadoc)
    	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
    	 */
    	public void stop(BundleContext context) throws Exception {
    	}
    }

    每个Activator都实现了BundleActivator这个接口。OSGi就通过这个调用接口的 start()和stop()实现Bundle的启动和停止。
    注意:bundle 的 Activator 必须含有无参数构造函数,这样框架才能使用 Class.newInstance() 方式反射构造 bundle 的 Activator 实例。

  7. 运行实例。和普通Java程序直接运行不同的是,运行Bundle需要一些配置。选择Run->Run Configurations…,在 OSGi framework 中右键点击选择 new 一个新的 OSGi 运行环境
    Bundle运行配置初始对话框
    Bundle运行配置初始对话框
  8. 在右边的运行环境对话框中,输入运行环境的名字、start level 和依赖的插件。Start Level越高,启动顺序越靠后。图中默认的Start Level(SL)为4,我们把helloworld的Start Level设置为5,即较后加载的Bundle。由于目前不需要其它的第三方插件,因此只需要勾上系统的 org.eclipse.osgi 插件,如果不选择此插件,hello world 将无法运行。只有当点击了 validate bundles 按钮 ,并且提示无问题之后,才表明运行环境基本 OK 了。runconfigrequirebundel1
  9. 点击“Run”,运行,应该能够在Console看到HelloWorld输出
    运行控制台
    运行控制台

OSGi控制台使用命令行控制Bundle的状态查看、加载、卸载和更新。OSGi的好处在于能够在不重启应用的情况下,实现对模块的热插拔。如通过SS命令查看所有Bundle的简单状态(SS=Simple Status)。图中模块的状态为ACTIVE。
runss
下图展示了OSGi Bundle的状态图:
我可以直接修改HelloWorld里Activator的代码,编译后。使用Refresh命令更新helloworld的Bundle,得到更新后的运行输出:runchangedrefresh
下面列出了主要的控制台命令。也可以在控制台中输入? 获得帮助

类别 命令 含义
控制框架 launch 启动框架
shutdown 停止框架
close 关闭、退出框架
exit 立即退出,相当于 System.exit
init 卸载所有 bundle(前提是已经 shutdown)
setprop 设置属性,在运行时进行
控制 bundle Install 安装
uninstall 卸载
Start 启动
Stop 停止
Refresh 刷新
Update 更新
展示状态 Status 展示安装的 bundle 和注册的服务
Ss 展示所有 bundle 的简单状态
Services 展示注册服务的详细信息
Packages 展示导入、导出包的状态
Bundles 展示所有已经安装的 bundles 的状态
Headers 展示 bundles 的头信息,即 MANIFEST.MF 中的内容
Log 展示 LOG 入口信息
其它 Exec 在另外一个进程中执行一个命令(阻塞状态)
Fork 和 EXEC 不同的是不会引起阻塞
Gc 促使垃圾回收
Getprop 得到属性,或者某个属性
控制启动级别 Sl 得到某个 bundle 或者整个框架的 start level 信息
Setfwsl 设置框架的 start level
Setbsl 设置 bundle 的 start level
setibsl 设置初始化 bundle 的 start level

终于发本本了

入职和实习的最大区别,除了门卡之外,就是是否需要自带笔记本上班。打入职的那一天起,我就在yy可以有一台华丽的新本本,老闫还号称帮我申请的是一台粉红色的DELL。。。好吧。。
今天终于看到了OA上领导对于申请本本的批示:先用库存。。。好吧,我明白了,那就是用旧的先。跑去行政部,心里一直在祷告,给我一台9成新的吧。。结果到了一看,果真是希望越大失望越大,D610,也就和我以前的DELL一个时代的产品,有五六年了吧。认了,签了收条,拎着大砖头回到座位上。
事隔多年,我又用上了512M的本本,真不容易,下午装软件装的我想抓黑板,用512跑office2007和oracle。。。简直是自虐。。。
吃亏是福,我就这么安慰着自己吧,好歹不用背着电脑包上班下班了。

越狱的主旋律结尾

虎头蛇尾的PB终于结束了,在我看来很主旋律。坏人死的死,坐牢的继续把牢坐穿,剩下一个脑残了。好人都有好报,Michael虽然死于脑瘤,但也留下了孩子。没什么太多的遗憾,也完全没有续拍的可能。
PB算是我追看的第一部美剧吧。在此之前看的美剧除了短剧兄弟连外,就是Friends了。我一向对电视剧不怎么感冒,而对纪录片倒是情有独钟,本科时收集了一大堆刻了盘,估计现在都看不了了。
我开始看PB时已经是S2了。之前虽有所耳闻但却提不起兴趣。记得某个晚上吴波在看EP03,声音开得比较大,吸引了整个宿舍的目光。虽然那时已经晚上11点半了,但我们还是坚持看了两三集,到一点多才上床。至此一发不可收拾,一直到现在一集不拉(基本在播出后一个星期内即看掉),即便是遭人诟病的S3。
这也是我追看的美剧里唯一善终的。之前看Justice和Shark,都播出不满两季即遭腰斩。Tudors看过S1,第二季的时候实在懒得再追了,现在似乎还活着。今年寒假开始看的Numb3rs,我的进度停在了S2,现在早就放到了S5。目前还在追看很热门的Lie to Me。前两天猛然发现是海上钢琴师那个主角主演的。
LP在字幕组打工,我偶尔也帮帮忙,翻了几集Law & Order和Monk。发现做一集字幕还是很辛苦的,感谢那些无私的字幕组。
Friends代表了上一代美剧迷,PB是这一代的标志。也许很多人不同意,但论在国内的影响力,PB的地位无与伦比。几乎从来没有哪部美剧的主角能在国内接那么多广告(不管山寨还是正规军),能把南京路给堵死,进度能偶尔在报纸上看到,剧终了能在新浪上搞个专题。不知道下一部重量级的美剧在哪里呢?

推荐一篇博文-我在南大的七年

算来已经连续三天没写博客了,前两天主要是忙,一个是APIS的权限系统的调整,虽然不着急,但是打算一口气搞定,所以花了很多时间。另外老板要我做一个精品课程申报的网站,我本来草草搞了一份,老板不满意,后来才照抄MIT OCW的弄了一下。课程主页在这里,没想到现在学院的课程体系已经搞得这么复杂,Java、软工和软工实践合成一门大课,像大学数学那样放在两三个学期上。
昨天看到刘未鹏总结性的博文:我在南大的七年,可能有很多人看过了。读后很有感触,特此推荐。手头忙完了,却开始感概了,小翼说在上海话里这叫“劳碌命”。

压缩软件

大概99年的时候,家里有了电脑。那时候机器贵硬盘空间小,虽然8000块钱的机器,硬盘只有5.1G。宽带还没普及,经常要用到1.44M的软盘。压缩软件自然居家必备。Windows 98的时代,Windows还原生不支持zip,需要Winzip来搞定。可是Winzip只是共享软件,非免费软件,过了试用期都会提示你付费,只好到处找破解版。后来Winrar不知为何取代了Winzip,占领了用户的桌面。(后文有解答)
这几天导师让我做个课程主页,里面要带上Slide。可是Office转换而成的HTML效果总是不尽如人意,而且一般总是IE only。还好有个网站叫Cometdocs,支持PDF->HTML。我先用PDF Creator打印成PDF,再上传到网站转换HTML。
转好了发现体积太大了。原本2M的Slide转成HTML居然涨到了10M。这也不能怪别人,HTML和PDF很不一样,背景图一张一张分开放,Slide一多就不行。正愁怎么发给老板,想到了7z的压缩比比zip好,于是就压缩成7z的格式试试。
一试吓一跳。25M的网站,压缩成zip剩下23M多,换成7z只剩下4.5M!!!原来7z支持文件间的对比压缩,而这些幻灯片的背景图大同小异,自然得到很理想的压缩比。不过文件间压缩的缺点在于,一旦只想解压缩一部分文件的时候,只能解压缩所有的文件之后再把目标文件给抽出来。
在搜索7z文件间压缩的时候,不经意看到善用佳软的两篇推荐7zip的文章,在这里这里。其中提到的传奇文章《压缩大战真相》,揭露了当初RAR PK掉ZIP的一些故事。
最后再给7-zip做做广告。全免费(个人可能无所谓用破解,但公司可承担不起这个法律风险),支持格式丰富,压缩比高,使用简单。用惯了winrar也不用怕,7zip也支持rar的解压缩,别人发给你的rar照样能打开,基本没有软件切换的成本。
想起来俺家小白也在我的唆使下用起了7-zip,挺好使的,是吧?

读研 or not 读研

最近做项目,和大三的学弟学妹们有些接触,读不读研自然是个经常提起的话题。虽然现在当了两年的烟酒僧,但我也还没把自己读研是否划算这档事给算计清楚。不过,即使算清楚了也没啥用,虽然现在很有套牢的感觉,而且还是那种有限售的套牢,想止损都不行,但目前的首要任务还是尽可能提高期望收益吧。
言归正传,前几天我在博客上对研究生这个牌子砸了发了点牢骚。今天正好看到两篇文章,都是对本科研究生贬值的感慨,却得出了截然不同的结论。正方感叹本科不够用,

所以呢,大家还是都去读研吧,反正现在研究生又疯狂扩招,虽然不知道等到研究生毕业是不是研究生学位也不够用了。。

反方材料比较多,不止是发发牢骚,还搬出了很多背景知识。最后的建议是:
由于硕士学位的贬值很快就会出现,所以你一定要想清楚,将宝贵的青春和金钱,用来交换一张意义不大的学历证书是否值得。

如果你喜欢搞科研(愿意当大学老师),那就不要停留在硕士,坚持下去一口气把博士学位拿到。很多学校都有“硕博连读”项目,本科毕业后,4~5年拿到博士,这还是值得的。
否则的话,本科毕业后还是应该直接选择就业。除了名校可能会有一点区别(更好的机会、更好的图书馆、更好的同学),其他学校的硕士意义不大,你得到的很可能不如你失去的东西多。至于“专业学位”,如果你是应届生的话,还是把它忘了吧。

下面的内容,打算出国的同学请绕道,呵呵。
具体一点,谈谈学院的研究生。想报送工学的同学们,不要对工学硕士的科研生活有太大的期望。按照现在3届学生的经验,你们只能靠自己做研究,学院能提供的,除了基础设施以外,很少有具体的科研项目。更多的时间埋没在导师的项目里,这里我就不说了。不过现在我也听说有些科研项目也上路了,具体情况不详。工学对于工程的优势一个在于现金成本,一个在于有导师的定期指导。而劣势是一年的时间成本和没有实习的锻炼,前者抵消了现金优势。
工程硕士对于软院的本科生来说,工程硕士就是大五+实习。和本科时一样的上课,一样的三学期,一样的实习,一样的无导师,除了最后学位服换成蓝的,论文要比本科厚一倍。4万块钱加上2年的时间,换取半年多的实习经验和一张硕士文凭。好消息是求职时用人单位并不太在意工学还是工程,都是参照硕士待遇。
微观经济学的第一课都会谈谈机会成本,纠结的同学们算算你们的机会成本。第一个问题是是否读研。读研相对于找工作,机会成本在于 1)这2-3年间的工资损失 2) 2-3年的工作经验损失 3)可能的学费支出 4)研究生贬值,可能找不到比本科更好的工作 5)取得读研资格的成本。对于大部份同学来说,财务成本放到长远来看的话,1,3项是微不足道的。第4项其实是读研究生的期望收益,读研究生不就是为了将来可能找到更好的工作吗?如果你读研究生后还找不到比本科更好的工作,那只能说研究生白活了,况且今年的经济形势还这么糟糕。对比第三条的成本和第四条的收益,砝码往往掌握在取得读研资格的成本上。如果成本为0,天平往往就向读研倾斜;如果考研把握不大,往往向工作倾斜,毕竟考研失败的成本往往包括了失去不错的工作机会。
最后我的结论是,首先能保研就保研。如果想读博,上工学;想像我这样,拿张研究生的文凭做敲门砖的,同时经济条件能承受的,就是工程了。

终于入职了

还是上班时间,偷偷摸摸的来写blog
5月13日终于入职了,感谢亲爱的老妈一拿到报到证就坐最快的动车赶到了上海,让我成功的在第一时间入职,mua一下
入职了就不能那么散漫了,怎么说2个月的试用期随时有被炒鱿鱼的可能。。还是很怕怕的。。我很胆小。
不知道什么时候才能有门卡,饭卡,本本。。。

一头汗的爱立信电话

今天下午在宿舍,突然接到一个010的电话,迟疑着接了电话。电话那头是个普通话不错的GG,要我明天去参加明天爱立信的宣讲会,顺便去帮帮忙。我一头大汗,根本没投爱立信啊。我说,我没投你们家啊,然后对方就有点语焉不详了,一会儿说有人推荐,一会儿说别的。
晕死。

雇主见面日

上周六去上海参加了ACCA就业力大赛雇主见面日活动。参加这个活动本来是为了考次博思的,无心插柳进了下一轮,就去见识见识。
之前收到官方邮件说要穿正装,头都大了。首先我没有正装,第二在30多度的正午在外晃荡实在是一种折磨。匆匆找上海同学借了正装,买了双25块钱的皮鞋,找见比较见得人的衬衫,没打领带,顶着正午12点的大太阳,从中山公园奔赴东华大学(其实也就3站公交)。
到早了,正好看看KP,PWC和Henkel发的材料。绝大多数人穿得很official,也一脸稚气。
前面各个企业做了宣讲,记得有KPMG,PWC,BestBuy,Citi,DTZ,Dupont,GE,Grant Thornton, Henkel,Whirlpool。其他就不记得了。
没想到Whirlpool的HR面是群面,God,昨天我刚经历了Ebay的群面。。。6人小组,只有我是男的,只有我是上海外地的学校。讨论话题是:“Obama当选美国总统,能力重要还是机遇重要?”。我们的讨论比较失败,基本没跳开Obama,中间几次我有意把大家扯出来,未果。不过这次群面感觉明显比昨天的好,正好碰上我比较熟悉的国际时事政治方面,而其他女生估计平时都没怎么关心吧。