Ant是Java开发界领先的构建工具,而Eclipse是主要针对Java程序员的集成开发环境(IDE)。Eclipse在可视化方面做得非常优秀,而Ant却提供了极强的构建功能。因此,Eclipse 3.0版本中一同发行了Ant1.6.1(本文成文之时),并且在Eclipse中提供了一个可扩展的Ant接口。
提示:难道Ant没有它自己的IDE?这个问题提得好!其实,在2000年出现的Antidote最初有望成为Ant IDE(见http://archive.apache.org/dist/ant/antidote/),但不幸的是,这一工程如今面临被淘汰,因为大部分开发类似Eclipse这样IDE的高手们已经把Ant集成到他们自己的IDE中了!
一、 Eclipse简介
如果你是一个Java开发者,你会知道直接使用Java SDK进行开发有时非常不便。Java SDK没有提供现成的import语句,忘记了变量声明,漏掉了分号,还有混淆的语法和文字输入等一系列问题往往会导致Java命令行编译器(javac)显示大量的错误信息。
这些错误消息告诉你,javac知道错误之所在;既然这样,那么,为什么不纠正这一问题而让你继续开发呢?很遗憾,javac无法解决这个问题。为此,你可以选用一种IDE,它能够在你编译之前捕获错误并且提供建议方案。Java急需一种很好的IDE,而今天杰出的Java IDE就是Eclipse。你可以从图1看到Eclipse的外观。
![]() 图1.Eclipse界面 |
Eclipse是可自由下载的;但是值得注意的是,Eclipse背后有一个相当的优势,这就是IBM的力量,据报导IBM为了开发它花费了四千万美金。现在,它变成了一个开源项目,其大部分仍由IBM主持开发;另外,一个称为eclipse.org的软件协会也负责Eclipse的部分开发。
下载Eclipse
Eclipse可自由下载;你只需转到http://www.eclipse.org/downloads,然后从该页面上选择一个可用的下载镜像站点。之后,你会得到一串可用的下载不同类型版本的链接地址:
发行版本-该版本是为了一般使用。
稳定版本-这是相对于beta版本的。
集成版本-该版本由经过良好测试的组件构成,但是其操作可能还存在一些问题。
夜间版本-这是所有公开可用的Eclipse版本的主要内容的试验样品。它们是由Eclipse小组在夜间所开发,因此没有保障会运行良好。
再下来,选择适合你的操作系统的版本,然后下载Eclipse。Eclipse的安装很容易;只需相应于你的操作系统版本进行解压即可。然后,你得到一个可执行文件Eclipse.exe,运行它即可启动Eclipse。在你第一次运行Eclipse时,你会看到一个欢迎页面。之后,你可以点击适当的链接来取得Eclipse的概述或教程。
二、 创建Eclipse工程
如果你已经安装了Eclipse,那么你可以直接存取Ant/Eclipse接口且不需要作任何其它操作。在Eclipse中的开发是基于工程的。下面,我将创建一个新工程来说明怎样从Eclipse中调用Ant。为了创建一个新工程,选择"File→New→Project",于是打开"New Project"对话框,选择Java Project项目并点击Next。
然后,输入工程名AntExample,并点击Finish。
于是我们就创建了一个新工程;你可以看到AntExample工程出现在Eclipse的Package Explorer的底部。
到目前为止,这个工程是空的。为了添加Java代码,从Package Explorer中选择AntExample工程并且选择"File→New→Class"以打开"New Java Class"对话框。然后,填写包名为org.antbook,新类的名字为AntClass,并且选择标记有public static void main(String[]args)的复选框以使得Eclipse创建一个main方法。最后,点击Finish按钮。
以上步骤将创建一个代码文件AntClass.java,你会在图2中部的Eclipse编辑器中看到这个文件,它具有一个完成后的main()方法。
![]() 图2.一个新的Java类 |
添加下面一行代码(加粗部分),以便让该类做一些事情:
| public static void main(String args[]){ System.out.println("No worries."); } |
然后,点击工具栏中的Save图标保存AntClass.java,并选择"Run→Run As→Java Application"。最后,你会在Eclipse底部的Console选项卡中看到这部分代码的输出结果。
三、 在Eclipse中编写Ant Build文件
为了在Eclipse中创建一个Ant build文件,右击在Package Explorer中的AntExample工程并且选择"New→File"。在"File Name"框中,输入build.xml,并且点击Finish,于是把这个新文件添加到AntExample工程中。为了把这个工程的输出打包,需要在这个build文件中输入下面的XML:
| <?xml version="1.0" ?> <project default="main"> <target name="main" depends="compile, compress" description="Main target"> <echo> Building the .jar file. </echo> </target> <target name="compile" description="Compilation target"> <javac srcdir="org/antbook"/> </target> <target name="compress" description="Compression target"> <jar jarfile="Project.jar" basedir="org/antbook" includes="*.class" /> </target> </project> |
在输入这部分XML以后,保存这个新的build文件。Eclipse对于Ant的支持是明显的;你会看到build.xml出现在Package Explorer的左边并显示一个Ant图标,而且在build文件中的XML声明部分以某种颜色点亮,属性值以第二种颜色点亮,而Ant关键字则以第三种颜色点亮,如图3所示。这个build文件的目标显示于右边的Outline视图中。
![]() 图3.在Eclipse中的Ant build文件 |
显然,Support for Ant是Eclipse的代码助手(提示:如果你关闭build.xml,你可以在Eclipse Ant编辑器中再次打开它;只需在Package Explorer中双击它即可。这与Eclipse的前一个版本不同(前一个版本没有默认的Ant编辑器,你必须采取其它方式打开Ant build文件才行。称作内容助手)),从Eclipse 3.0开始它被添加到Ant build文件中。当你针对Ant元素或属性输入部分文本时,你可以按下Ctrl+Space组合键来打开代码助手,它将列出你接下来可能要输入的内容,如图4所示。
![]() 图4.在Eclipse中使用代码助手 |
提示 如果你输入一个$并使用代码助手,Eclipse的Ant编辑器将列出所有它所了解的Ant属性名。
Eclipse 3.0能够捕获Ant build文件中的语法错误。例如,如果以</targe>结束一个目标,而不是用</target>标签,那么这会立即被Eclipse Ant编辑器所捕获,如图5所示。如果你让鼠标光标驻留于问题行左边的圆圈X图标上,你将看到Eclipse对于这个问题的解释:"Expected `</target>' to terminate element starting on line 3."仅仅这种语法检查和更正能力就值得把Ant纳入到Eclipse IDE中。
![]() 图5.处理语法错误 |
提示 :你可以使用Ant编辑器的上下文菜单中的Format命令(Ctrl-Shift-F)或选择"Edit→Format"来重新格式化一个Ant build文件。
想看一个属性值吗?可以把鼠标移动到它上面,然后它的值就会出现在一个工具提示小窗中。
提示 :在一些情形下,Eclipse能够为你生成Ant脚本。例如,如果你在创建一个Eclipse插件(它能够实现用你自己的视图和编辑器来扩展Eclipse),那么你可以使用一个名为plugin.xml的插件声明文件。如果你右单击这个声明文件并且选择"Create ant Build File"项,Eclipse将为你创建一个build文件。如果你选择"Project→Generate Javadoc",那么Javadoc向导将创建一个运行javadoc工具的Ant build文件,你可以据需要编辑它。
四、 运行Ant Build文件
你可以使用两个选项来从Eclipse内部运行这些build文件。例如,你可以右单击Package Explorer中的build.xml文件并选择"Run→Ant Build"。这样可以启动Ant并且把结果显示在Eclipse的Console视图中。
提示:Eclipse 3.0用一个独立的JVM运行Ant,这样以来解决了过去常常给IDE带来的许多问题。
如果你在命令行上运行该build文件的话,其输出结果将会与在Console视图中的输出一样:
| Buildfile: D:\eclipse3\eclipse\workspace\AntExample\build.xml compile: [javac] Compiling 1 source file compress: [jar] Building jar: D:\eclipse3\eclipse\workspace\AntExample\Project.jar main: [echo] Building the .jar file. BUILD SUCCESSFUL Total time: 2 seconds |
如果存在问题,你可以观察在Console视图中的Ant的输出。Eclipse将在Problems视图中给出一篇摘要,你可以点击Eclipse底部的Problems选项卡来看到这篇摘要内容。
运行build文件的另外一个选项是右单击Package Explorer中的build.xml并且选择"Run→Ant Build..."(注,这里有个省略号)。这样会打开如图6所示的Ant启动配置对话框,该Ant启动配置是特定于当前工程的。
![]() 图6.选择一种Ant目标 |
缺省情况下,这个对话框自动选择Targets选项卡,并显示一串build.xml文件中的目标。缺省目标被选中;你可以点击Run按钮来运行该目标,或选择其它目标来运行。如果你选中缺省的目录并点击Run,那么你将看到如前面的Console视图中相同的结果。
你可以设置目标的执行顺序,之后你会在页面底部的Target执行顺序框中看到这一顺序(你选择项目的顺序正是它们被执行的顺序)。Ant还会运行每一个目标的依赖性;但是,你必须小心以防你的修改有可能弄糟整个构建顺序。
五、 选择Build文件并把参数传递到Ant
你可以在Eclipse环境下使用与命令行一样多的Ant功能。例如,为了把参数传递给Ant,可以在Package Explorer中右击build.xml并且选择"Run→ Ant Build..."来打开Ant启动配置。然后,点击显示在图7中的Main选项卡即可以设置你想使用的build文件,构建工程所依赖的基目录等,并且你可以把参数传递到Ant。
![]() 图7.设置要传递到Ant的build文件和参数 |
提示:在该对话框底部的Capture输出复选框指示是否你想要把Ant输出捕获到Eclipse Console视图中(缺省情况下就是如此)。
IMified
IMified 提供了任务管理、提醒,代办等工具, 通过IM机器人来支持AIM, MSN, and XMPP/GTalk。他们刚发布了了一个API,可以用它非常容易的创建支持所有主流IM平台的机器人,把我们想干的事都做了啊,他们的后台则是采用Openfire的。
Mosoto
Mosoto是一个for Facebook的即时协同系统,同时也具备文件和音乐共享功能。他们是领先的实现Facebook API实现厂商之一,并且具有漂亮的Flash界面。目前是Alpha版本的, 应该会迅速壮大和成熟(想想Facebook的用户数). 他们也是基于Openfire 和 XIFF Flash API.
Justin.tv
最后, 我们听说国外的一个Web 2.0大会Justin.tv使用的聊天技术也是基于的。如果你没有去过这个网站, Justin使用一个移动的摄像机 24×7 向网站进行直播的,有兴趣可以去了解一下
3个例子代表了一种趋势: 我认为 XMPP 将会在下一代web的架构中(包括Google)发挥一个关键的作用,最近的一些相关协议如BOSH (for网页的XMPP), Jingle (voice and video) and PEP (advanced presence features)将会推动这方面的发展。
Tim 翻译 http://hi.baidu.com/jabber/blog/category/Openfire
自igniterealtime(原来的jivesoftware)的网站 http://www.igniterealtime.org/blog/2007/04/30/openfire-powering-web-20/
|
SparkWeb 是一个基于Web ajax技术的XMPP客户端,就是一个web版的spark,安装比较简单,
将sparkweb.war copy到plugins目录即可,也可以在 web 管理后台通过添加 plugin 实现安装。它需要 Openfire 的 http binding 模块的支持。 安装完之后的访问路径是: http://<服务器名>:<http-binding端口>/sparkweb/ 本机访问的话通常是 http://localhost:8080/sparkweb sparkweb 采用商业授权。 |
Apple, Nokia, Deloitte & Touche and Delta Airlines.
Jive Software has over 1,400 customers globally, including IBM, Sun, Oracle,
BEA, Deutsche Telekom, USJFCOM, Citrix and Toshiba.
Jive announced on August 29 that it has received $15 million in funding from Sequoia Capital(红杉资本).
资金主要用于产品研发。包括公司的拳头产品Clearspace,此产品将和IBM,Microsoft竞争。Openfire预计也会加大投入,所以从发展的眼光来看,Openfire将会在XMPP领域更加一枝独大。
Jive目前有63名员工,2007销售收入预计是1500万美元。
- 比较有价值的,有fastpath和archive,fastpath可看我前面的介绍:fastpath 基于openfire 的客服 web im;chat archive就是在服务端保存所有聊天历史的支持。
- openfire clustering集群不会开源,由于集群90%的功能是通过Coherence clustering software第三方软件来实现的,并不是openfire本身的功能。Coherence是一种内存共享的模型,内部处理多台服务器的逻辑,上层的应 用可以当作单机来使用。这个模块担心以后版本会去掉,jive是想把openfire丢出去给开源社区,只剩下clustering商业化也没什么价值。另外jive在短 期之内把clustering重新开源实现的可能性也比较小。本来就不是它的看重,以后更不会是。特别看重cluste功能的用户最好去投奔ejabberd了。
- Jivesoftware 今后的核心转移到 clearspace 上了,今后 openfire 最大的工作是整合 clearspace 并提供所需的social & collaborative的功能。XEP的支持不是首要考虑的,不过目前的XEP也够用了。
- Clearspace整合。从最新的源代码也可以看到,增加了许多 clearspace 的程序。对于单独部署 openfire 的用户那些功能可能是鸡肋。
- web im。纯Web,使用comet/HTML/ajax,不是基于flash的XIFF, Flash虽然也不错,但是与其他应用集成不便。
- 开放性。服务器架构的开放, plugin机制已经做得不错了,不过有不少需求还是需要改源代码才能实现。改了源代码,服务器又有新版本了比较烦。
- 独立性。最好不要做 org.jivesoftware.openfire.clearspace 这样的集成,感觉丧失了独立性,如果需要对外提供roster等功能,可以做成标准的api,第三方也可以用。不要成为clearspace的附庸。
- c++ 的客户端,pidgin那样的最好,啥都可以连,spark国内的接受程度低。(4应该没有可能:)
- Reporting and Chat transcripts plugin - 一般
- SparkWeb - SparkWeb 是基于flash的。
- Client Control plugin - the ability to manage clients will be available as an Openfire plugin
- Fastpath plugin - Web IM
- Reporting and chat archiving - 就是聊天记录保存在服务器。
Presence的复杂性体现在:
1. 由于每个用户都有1到多个好友,服务器的处理量被放大。
2. 分布式处理的复杂度,你的好友可能同时分布在n个服务器上,而且同时上线的好友没有规律。
3. 请求量不均衡,可能瞬时非常大。比如你服务器刚重启所有的客户几乎同时自动重连过来。比如Twitter宕机都是在一些热点事件时,大家活跃度突然同时增大。所以系统必须按峰值的处理量设计。
4. 缓存cache设计困难。每个用户的在线好友都不同,而且随时在变。
5. 隐身同黑名单的业务逻辑很难高效处理。
Openfire Server处理presence的流程如下,以3.6.0为准。

1. ConnectionHandler.messageReceived();
mina 层面处理。
2. StanzaHander.process() => processPresence
xmpp 层面。处理所有xmpp包的方法,实际上只有login相关包在这里处理。其他类型的包交由相关逻辑类来处理。 由于是个presence包,交由下面presence逻辑处理模块进行。(also add from to packet)
3. PacketRouteImpl.route() // route presence
4. PresenceRoute.route() => handle() // route presence
由于presence是一个需要路由的包,路由主要区分目标是本机还是远程,是component/server还是普通用户。
5. PresenceUpdateHandler.process() => broadcastUpdate
// process() update db and update cache,
calls PresenceManager.userAvaliable(); session.setPresence()...
6. Roster.boradcastPresence();
检查privacy list(隐身及黑名单用户)然后路由给所有在线好友。
7. RoutingTable.routePacket, routeTable.getRoutes()
真正的工作在这里,较慢。
8. session.process(), session.deliver
已经分发到相关用户了,调用该用户的session投递给此用户
9. nioconnection().deliver, deliver to the end users
再回到MINA
因此Presence投递工作的核心是在6~7,不过其他的步骤也有不少细节的处理。Openfire中6~7的实现比较精简和优雅,但如果想作为一个大型的高效消息投递系统还是有改进的空间。
- 本来以为 fastpath 是个纯 web im spark, 但是安装之后发现是个客户服务的系统。
- 安装 Openfire Enterprise 才有这个模块,openfire enterprise 要收费的,但是试用版可以支持5个用户,不违反授权,永不过期。
- 界面是英文的。但是可以自己改jsp。
- 管理端要用spark
- 在线/离线的图标是一段代码,可以插入到任何网页中(asp,php...)
- 离线状态下用户在网页的留言可以自动发送email
- 支持workgroup,应答人员可以1到多个,随时调整,不需要改网页代码。
- 支持按Lucene全文检索匹配条件指定服务端应答用户。
-


- 蓝色的箭头是发送,红色的是接收
- 利用connection manager来实现multiplex
- 每个IM用户用一个WebIMSession来保存会话信息
- 到openfire之间连接很少,通常5个
- 收到消息之后通过WebIMSession定位到用户,触发ajax listener到界面弹出信息
- 瓶颈在web ajax connections / web server
三、 Jabber客户端安装配置
1. 软件下载
客户端软件列表请参考:http://www.jabber.org/software/clients.shtml
我们将使用Spark,因为Spark和Openfire能够很好的相互支持。软件下载地址:http://www.igniterealtime.org/downloads/index.jsp#spark
Windows含java环境版:http://www.igniterealtime.org/downloadServlet?filename=spark/spark_2_5_8.exe
目前最新的版本为:Spark 2.5.8
2. Windows安装
(1) 下载for windows的版本,运行spark_2_5_8.exe,一直点下一步,就可以安装成功了,默认安装路径C:"Program Files"Spark
(2)选择登陆界面的高级选项:服务器填入你的服务器地址,端口默认为5222,点击确定。

(3) 用我们在Openfire管理控制台中添加的test用户登录。
(4) 登陆后界面

(5) 注册一个新帐号:
在spark登陆界面点击帐户,在建立新帐户界面中输入相关信息,点击创建账户。

(4)注册成功后,就可以用test2登录。
四、 Jabber连接与MSN、ICQ等IM通讯
Jabber最有优势的就是其通信协议,可以和其他给予XMPP协议的即时通讯软件连接。如:MSN 、Yahoo Messager、ICQ,GTalk等。
1. 下载Openfire网关插件IM Gateway
下载地址:http://www.igniterealtime.org/projects/openfire/plugins.jsp
在这里可以下载到openfire的所有插件,我们需要的是
2. 安装gateway
Gateway的安装非常简单,你只需要把gateway.jar拷贝到openfire/plugins目录下,重启Openfire服务,即可安装成功。
3. 配置gatway
安装成功后,打开Openfire的管理控制台(例如:http://localhost:9090/),即可在左侧菜单栏下方看到gateway的安装选项(目前没有中文版),如图:

点击Settings,然后在你需要激活的服务上打勾即可。
4. Spark客户端配置
重新用Spark登录Openfire,在Spark菜单栏下多了一些选项。
点击MSN的图标,选择输入登入资讯。
填入你的MSN帐号和密码,就可登录MSN了。

一、 安装环境
操作系统:Windows XP Prefessional SP2
服务器软件:Openfire 3.4.2
Openfire Enterprise 3.4.2
客户端软件:Spark 2.5.7
Spark Fastpath Webchat 3.4.1
JDK:J2SE 5.0 (1.5.0_03)
二、 安装Jabber服务器软件
1. 软件下载
Jabber官网地址:http://www.jabber.org/
常用Jabber服务器软件:http://www.jabber.org/software/servers.shtml
本文以Openfire(Wildfire)为服务器,一款基于GPL协议开源软件,支持各种操作系统,软件需要java环境支持,不过软件本身自带了环境包,你可以根据你的需要下载不同的版本。
下载地址:http://www.igniterealtime.org/downloads/index.jsp#openfire
Windows无java环境版本地址:http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_3_4_2.zip
最新版本:Openfire 3.4.2
2. Windows版本安装
将openfire_3_2_2.zip解压缩到D:"。直接运行安装文件,D:"Openfire"bin"openfire.exe
3. Openfire服务器配置
浏览器地址栏中输入http://localhost:9090/即可开始即时通讯服务器配置。
(1) 语言选择:中文简体
(2) 服务器设置:选择域及端口,建议默认
(3) 数据库设置:选“标准数据库”
(4) 标准数据库设置:在数据库驱动选项栏选择Oracle。
数据库URL填入你的数据库地址,端口和数据库名称,以及用户名和密码(需要在安装前创建),最大连接数,最小连接数和连接超时时间可自行调整。继续之后Openfire会在你指定的Oracle库中创建表并初始化。
(5) 特性设置:默认为初使设置(应为初始设置,翻译有误)
(6) 管理员帐户设置:填入系统管理员信息
(7) 安装完成
(8) Openfire管理控制台:至此,Openfire安装完毕。你可以继续登录到管理控制台,进行更为详细的设置。
(9) 添加新帐户:
打开管理控制台的用户/组标签页,可以看到当前服务器上已有用户的摘要信息。
选择左侧菜单栏中的新建用户,输入用户名和登陆密码,点击创建用户完成新用户的添加。
在客户端就可以用test这个用户登录了。
四、 Spark Webchat的安装
Spark Webchat是基于web的Spark,需要Openfire企业版的支持。
1. 软件下载
Openfire企业安装版下载地址:
http://www.jivesoftware.com/evaluation!input.jspa?type=of
需要添加一些基本信息,点击“Submit and Download”,在此页面中可以下载到试用版,30天25用户授权,过期后5用户授权, 或者复制许可证号。
企业版插件及Spark Fastpath Webchat插件下载地址:
http://www.igniterealtime.org/projects/openfire/plugins.jsp
2. windows版本安装
两种企业版安装方式:
l 直接运行Openfire企业安装版,openfire_enterprise_3_4_2.exe,并进行相关配置。
l 基于之前安装过的Openfire安装:将enterprise.jar复制到D:"openfire"plugins"下,重新启动openfire。进入管理控制台的Enterprise标签页,并复制许可证号到这里。
3. SparkWeb使用
(1) 点击左侧菜单栏的SparkWeb,出现登陆界面。
(2) Spark web主界面
(3) 添加联系人
(4) 发送信息
(5) 接收到信息
Spark web不能保存聊天记录,不能传递文件,当然更不可能支持声音视频等。







