osgi学习笔记
对osgi有了一个初步的了解之后,准备写段代码跑跑,一试身手,
先下载了一份Bluedavy 的《OSGI实战》
里边有可以直接运行的代码,双击run.bat运行正常,暗爽!
开始练习《OSGI实战》中用户登录验证模块,一行一行敲代码,第一个变化就是工程之间相互引用不能在Build path里添加工程引用了,改成了在MANIFEST.MF当中添加Import-Package
在学习过程当中还是遇到了不少问题,记录下来,帮助遇到和我同样样问题的少走弯路。
我用的是eclipse3.4 jdk1.6
1.Import-Package时org.eclipse.equinox.servlet.api这个包死活找不到。
在eclipse3.4已经不存在了直接导入javax.servlet_2.4.0.v200806031604.jar就可以了
如果没有添加javax.servlet会出现 INSTALLED UserValidatorWebBundle_1.0.0
强行启动会抛出以下异常
org.osgi.framework.BundleException: The bundle could not be resolved. Reason: Missing Constraint: Require-Bundle: javax.servlet; bundle-version="2.4.0"
2.如果使用了Equinox OSGI Declarative Service需要下载 eclipse-equinox-SDK-3.4.2.zip
因为Declarative Service实现并没有包含在Eclipse的默认软件包中,需要单独从 Eclipse 的的网站上获得,下载包当中的plugins和features复制到eclipse当中重启
org.eclipse.equinox.ds_1.0.0.v20080427-0830.jar是运行时用到的bundle
org.eclipse.equinox.ds用到了org.eclipse.equinox.util_1.0.0.v20080414.jar
都要在config.ini当中添加并启动
3.一切看似启动正常了,log当中还是有以下异常
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
还得启动 org.eclipse.osgi.util_3.1.300.v20080303.jar这个bundle
4.如果http://localhost/demo/page/login.htm 这个页面不能访问可能org.eclipse.equinox.http_1.0.200.v20080421-2006.jar没有启动,如何htm能访问了http://localhost/demo/login 不能访问 可能org.eclipse.equinox.http.servlet_1.0.100.v20080427-0830.jar没有启动
总结一下用户登录验证模块要启动的bundle
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.2.R34x_v20080826-1230
1 ACTIVE ConfigFileValidatorBundle_1.0.0
2 ACTIVE DBValidatorBundle_1.0.0
4 ACTIVE UserValidatorBundle_1.0.0
5 ACTIVE LDAPValidatorBundle_1.0.0
9 ACTIVE UserValidatorWebBundle_1.0.0
10 ACTIVE org.eclipse.equinox.util_1.0.0.v20080414
11 ACTIVE org.eclipse.equinox.ds_1.0.0.v20080427-0830
12 ACTIVE javax.servlet_2.4.0.v200806031604
13 ACTIVE org.eclipse.osgi.services_3.1.200.v20071203
14 ACTIVE org.eclipse.equinox.http.servlet_1.0.100.v20080427-0830
15 ACTIVE org.eclipse.equinox.http_1.0.200.v20080421-2006
17 ACTIVE org.eclipse.osgi.util_3.1.300.v20080303
OSGI 最初印象
前几天被问到osgi是什么,虽然名字很熟,还真没有具体了解过它,于是开始google
OSGi——Open Service Gateway Initiative 字面上的意思是一个公共的服务平台。
OSGI 框架是一个微核结构的容器,所有的模块都需要运行在容器范围内,在 OSGI中所有模块的部署都必须以 Bundle的方式来进行部署,类似一个Bundle一个jar。
每个Bundle采用的是独立的classloader机制,就是一个Bundle对应一个Classloader,因为不同命名空间的两个类是不可见的,这也就意味着不能采用传统的添加工程引用的方式来实现Bundle间的协作了,Bundle间相互协作意味着不同classloader之间对象需要相互调用,在不同classloader当中只要得到类所对应的Class对象的reference,是可以访问另一命名空间的类的,于是乎被调用的bundle只要提供一个接口,在主调用bundle当中引用接口就可以实现bundle的相互调用。 这就保证了每个模块一个 Bundle 的开发方式并不会很复杂.实现了物理上的模块隔离。
它带来的是设计思想以及开发方式的改变,模块的组织方式决定了系统将如何进行开发以及如何进行部署,而模块的复用和扩展则是减少重复造轮子的过程在设计层面上主要是模块化设计、面向服务的组件模型设计以及动态性的设计三个方面,本质是将Java面向对象的开发转向面向组件和服务的开发。
java虚拟机当中保存着运行java程序时使用的所有对象,所有的对像都有明确的创建方法,但是没有明确的代码来释放他,垃圾收集器就是来自动释放那些不再被程序使用的对象。虚拟机规范当中虽然没有要求实现任何特定的实现技术,但是在发明可以无限使用的内存之前,大部分虚拟机都附带了一些垃圾收集器。垃圾收集器除了释放不再被引用的对象以外,还要处理堆碎块,这个碎片类是与操作系统当中的磁盘碎片。
很长时间没有更新了,很想来写点什么,可有时无从下手,不知道说点啥,写点java方面的吧,很长时间没有研究新技术了,方向把握不准,怕误人子弟。
说说自己吧,好像要说的事情太多,又是没有头绪,最近感觉自己失去了生活的目标,不知道是为了啥,做一天和尚撞一天钟,得过且过。实在是惭愧。
学习吧,没有动力了,静不下心来,刚想敲几行代码,又跑到网上溜达去了,反正是左一下右一下没有重点。生活应该有激情不是吗。
最近玩上了网游,堕落了啊,以前声称自己对网游从不感冒的我,也沦落到这个地步,世界变化真快啊,今天的想法总是能够战胜昨天的想法,不可思议。
上个月还结婚了,算是完成人生当中的一件大事,应该为自己庆祝一下,也算是没有让父母等的时间太长,尽了一份孝心。同时也算是给认识了多年的女友一个交代,都住在一起很长时间了,没有一个说法是不行的,婚礼嘛,就是为了告诉大家我结婚了,同时希望能够得到大家的承认和祝福,哎!一切还算顺利,难道我是被婚姻冲昏了头脑?
再往前还记得自己在下决心减肥,现在看来好像没有效果,我的毅力哪去了,缺少一个能拿皮鞭抽我的人啊,呵呵。
祝愿自己能够找回充满激情的生活。
这是一个鲁中南地区非常流行的益智棋类对战游戏。
在网上找了n久也没有人发现有人写出来过,估计是这种游戏流行面比较窄,很多人都不了解。所以决心把它写出来,就当作弘扬民族文化了。
这里的游戏规则不是我自己创立出来的,只凭着当年玩的时候留下的记忆,写出来的。尤其是在我上初中的时候,风靡的不得了,因为道具准备简单,就地捡一些石子和木棍,然后在地上画个棋盘就可以玩了。咱当年也是打遍全班无敌手(没吹牛。。。)
还是先介绍一下怎么玩吧
本程序用java开发socket通信,需要安装jdk1.4+ java web start的运行环境,如果没有安装jdk请从http://java.sun.com/javase/downloads/index.jsp 下载。
游戏下载地址:http://www.flyox.com/fivetiger/fivetiger.jnlp
启动游戏后会出现以下画面。

这是一个两人对战游戏,一共五行五列,在交叉点上下棋,双方轮流走棋,一次只能下一个棋子或者移动一个棋子,目标是努力组成图形吃掉对方棋子,同时阻止对方形成图形。吃光对方旗子者为胜利方。
第一步 建立游戏
点击右上角的【创建游戏】按钮,建立游戏,然后等待另一方加入游戏。
第二步。加入游戏
点击加入游戏下拉框,里面会显示已建立游戏者的ip,选中之后建立连接,就可以开始游戏了。
第三步 开始游戏
在右侧会显示游戏状态和当前走棋者。
游戏共分两个阶段:
第一阶段:下棋,在十字交叉点上安放自己的棋子。目标是努力形成图形(图形如下所示)并阻止对方形成图形。形成图形者可以压掉对方1~3个棋子。
第二阶段:走棋,在下棋阶段所有的棋子安放满了之后就可以开始走棋了,如果轮到走棋者无棋可走的话,双方可以相互拔掉对方一个棋子(已组成图形的不可以拔),走棋过程当中如果形成了图形,也可以拔掉对方1~3个棋子。
第四步:一方棋子被拔光之后为失败。一局结束之后自动开始下一局。
图形说明:0代表其他(包括对方棋子,空白,被压棋子)1代表自己的棋子,只要有形成以下图形的就可以拔掉对方1~3个棋子(从四个方向看棋子构成的图形)
图形:3斜,可以拔掉对方1颗棋子,共4种
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
4斜 可以拔掉对方2颗棋子,共4种
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
通天棍 可以拔掉对方3颗棋子,共2种
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 0 0 0 0
1五虎 可以拔掉对方1颗棋子,共4种
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
2五虎 可以拔掉对方2颗棋子,共4种
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
中五虎 可以拔掉对方3颗棋子,共2种
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
方 可以拔掉对方1颗棋子,共16种
0 0 0 1 1
0 0 0 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
很久很久以前。有这样的一个场景:
一个白胡子老头,和一个活蹦乱跳的小孩,来到一棵大树下,两个人就地画出了一个棋盘,五行五列,然后捡了一些石子和小木棍当作棋子,下起了棋来,
这个棋就是《五虎》,后来周围聚了一些看棋的人,然后越聚越多,然后就有人学着也玩起了这个棋,不一会的功夫整个树下就聚满了人群。
大家一盘一盘的较量起来,周围还不时有诸葛先生指点江山,不亦乐乎。
就这简单的25个棋子,却蕴含着无穷的智慧与乐趣!对启迪思维、开发智力、锻炼拼搏进取精神有很大的帮助。
大家一起来玩吧。希望你是第一个爬到网上,下起了《五虎》然后传播给大家的人。
欢迎交流,联系方式:s u n w e i 2 5 0 @ g m a i l . c o m
生死不离,你的梦落在哪里
想着生活继续
天空失去美丽,你却等待明天站起
无论你在哪里,我都要找到你
血脉能创造奇迹
你的呼喊就刻在我的血液里
生死不离,我数秒等你消息
相信生命不息
我看不到你,你却牵挂在我心里
无论你在哪里,我都要找到你
血脉能创造奇迹
搭起双手筑成你回家的路基
生死不离,全世界都被沉寂
痛苦也不哭泣
爱是你的传奇,彩虹在风雨后升起
无论你在哪里,我都要找到你
血脉能创造奇迹
你一丝希望是我全部的动力
由奥运会文化活动处处长王平久连夜创作
经过半个多月的努力,我的八国军旗终于有了一个样子了,先献上图片给大家看看。

初步打算是这样的:上边一对,下边一对,每个队伍轮流攻击对反,杀光对方,或者抗掉对方所有的旗为胜利方。
走棋的规则也是照抄四国军棋。
目前基本功能已完成一半。有登录,进入房间,选择棋桌坐下,调整布局和棋子之间相互吃子等。
将来需要做的功能有,做一个广播寻找主机的方法,目前是直接指定了服务器ip,房间数据的实施刷新,目前是选定座位坐下之后,不再更新房间数据。
另一个重要的地方就是走棋的功能需要完善,这个功能完成了就是判断输赢啦。可能写着写着还会发向有更多的功能要写。
这段时间有一个重大修改就是:
一开始打算把数据通信功能使用nio实现,这一部分基本完成的时候发现了MINA(异步连接框架)这个好东西,有点相识恨晚的感觉。于是决定使用mina重新写我的数据通信部分,做这个决定确实很痛苦,因为好不容易写好的东西推到重写,不过人家MINA包装的NIO确实好,咱也用不着再去造轮子,先拿来用上再说。
通过这一段时间的写代码最大的感受就是:增加了学习的动力,享受写代码带来的乐趣。
一、为多个项目指定使用哪个log4j文件
情况一:多个小项目合成一个大项目,多个小项目有自己不同的入口,这个时候如果使用同一个log4j文件,各个项目的输
出会混乱在一起,如果拆分成多个小项目,看起来又比较散不太好管理。
情况二:一个项目实施在linux上,编写在windows上,log4j的输出目录/opt/xxx/web.log
这个时候开发者被迫必须在本机的workspace所在的目录加入一个opt/xxx/web.log的目录和文件
同时,大多数情况下linux上的服务是不须要输出log到Console,只要输出到文件
而windows大部份是只须要输出到console,不须要输出到文件
本地调试的时候log4j的级别多是debug ,而实际实施的时候多是之上的级别
造成须要不停的修改log4j的属性文件,cvs同步的时候不停的提示
也许你说可以整个项目完成再来写log4j的属性文件,但有的时候这个效果并不好。
因为还有这种时候,项目完成(包括log),反复测试的这段时间。
解决:解决办法很简单,建立一个log4j的配制文件的目录,在这个目录下为每个小项目建立一个目录,
每个目录下放着自己的log4j配制,然後把这些目录作为每个小工程的classpath的第一个,ok上边的问题就
解决了。这个时候可以写一个log4j放在src下,用来开发时候调试用,而真正服务器上使用的都在各自的文件夹下
二,为默写包,某些类定义不同的log4j级别
是否想过这中需求呢,一个项目调试的时候,希望其中默写包不打出log信息。
比如struts的包,spring的包,还有你引用的别人已经开发好包,或者你自己写的类,但是你不想看到这个
类的log信息.但是你须要调试当前的一些class,log级别必须设置在debug级别
这个时候可以在log4j的属性文件中加入如下内容:
log4j.logger.包名or类名=高的级别
例如:
log4j.logger.org.springframework=error
三、注意事项
1 public void execute() {
2 // ..
3 logger.debug( " aa " + " bb " + " cc " );
4 }
5
是否这么写过呢?这样写是有些问题的。当你把log级别调整到info或者更高的时候,log信息是不输出了
但是字符串的拼接一样进行了,使你的程序效率降低,实验一下
1 public void execute() {
2 // ..
3 logger.debug(getStr());
4 }
5 public String getStr() {
6 System.out.println( " execute getStr " );
7 }
8
调整log4j属性文件级别到info 结果getStr()照样执行了
解决办法:
1 public void execute() {
2 // .
3 if (logger.isDebugEnabled()) {
4 logger.debug(getStr());
5 }
6 }
7
准备写一个八国军旗。
上辈人说的好,三天不学习,赶不上刘少奇。
jdk都到了1.6了,现在还在用着1.4,压抑啊。
精力旺盛的人总是闲不住。一有时间就研究点新东东,不学习会赶不上刘少奇的!研究归研究,不实际动动手,那还就是没有成就感~。
因为比较喜欢下四国军棋,下久了,就开始研究它是怎么写出来的,其实就是想看看有没有漏洞,做个弊,多弄点分什么的,嘿嘿!(目的不纯啊)
四国军棋已经有了,再写一个java版四国军棋岂不是很没有新意,咱写多国的。(其实八国军旗也新意不到哪里)
因为我只对java熟,没有其他选择只能用java,听说jdk1.6当中的swing有了很大的性能改善,暂定用它。
希望能在internet上运行,所以用不打算用udp的方式,免得丢包是麻烦,不过据说暗黑还有cs都是基于udp的,
因为前一阵研究了一翻nio,打算练习练习socket,于是选中tcp通信方式。有点为了技术而技术的感觉。
人家QQ游戏默认采用TCP通讯方式,端口443(是常见端口)。同时也支持HTTP代理模式及SOCK5代理模式,
我就不管这么多了一个端口就OK,能玩起来就很满意了。其他的地方照着葫芦画瓢。
参考qq游戏,有大厅,有房间,有棋桌。大厅那东西也不是我一个人能完成的,本着简单实用的原则,先跑起来,以后再慢慢扩大。
计划是这样的:一个服务端用来建立服务器,维护所有人的信息,保存所有棋桌的布局,判断胜负。
客户端负责显示布局,响应用户操作。
说白了,这种java2D的游戏就是如何通知各方在各自的JPanel上画东西,然后维护一堆数据。
可能其中会遇到一些困难,兵来将挡,水来土淹吧。
希望能够早点写完,并能玩起来,期待吧!
另外想研究udp的看看java版飞鸽的源代码是个不错的主意.