最近有时间来研究一下即时通讯,打算在将来的项目中用到;研究方向是Openfire+spark+flex3.一连几天在Eclispe下部署openfire都没有成功,关于这方面的文档资料也比较少.加之OpenFire工程项目目录比较复杂;所以真的很难一次成功.
Openfire的介绍在此不多说了,网上有很多关于这个基于Java的XMPP服务器的介绍,也可以通过官方网站http://www.igniterealtime.org/来寻找关于Openfire的信息。
如果研究Openfire的代码,建议第一步在本机上安装Openfire服务器和Spark这款XMPP的客户端程序,这样既可以熟悉一下Openfire的样态和功能,也可以在以后的源代码调试过程中通过Openfire的目录结构得到帮助.
准备工作:Eclipse环境(当然包括JavaSE),Openfire的源代码包(例如:openfire_src_3_3_2.tar.gz,可到jivesoftware官方网站下载),Mysql数据库V5以上(当然可以用其他数据库,但在此例中选用Mysql作为Openfire的后台数据库)。
第一步:有个好心情,通过Openfire的安装包将Openfire安装在本机上,具体实现见http://blog.csdn.net/expendable/archive/2007/06/25/1666122.aspx这里有详细的介绍。(除了数据库的部分)
第二步:将openfire_src_3_3_2.tar.gz解压后目录下除了Readme和License以外有四个子目录。
<!--[if !supportLists]-->1. build目录:build目录下收录的是生成安装文件(例如:rpm)所要的一些文件,例如JRE等。<!--[endif]-->
<!--[if !supportLists]-->2. resources目录:resources目录下收录的是一些为实现国际化(i18n)和本地化的一些编码文件(例如:英文,中文,法文,德文等)。<!--[endif]-->
<!--[if !supportLists]-->3. documentation目录:documentation目录下收录的是一些关于Openfire安装和配置的信息,但最终要的是这里有Openfire开发的Javadoc。<!--[endif]-->
<!--[if !supportLists]-->4. src目录:顾名思义这个src文件夹就是我们想要的Openfire源代码了,这下面又有许多文件夹,我们只要Java文件夹就好,这里面实现的Openfire的核心功能,通过它就可以调试Openfire了。<!--[endif]-->
第三步:在Eclipse中将此Java文件夹当成源代码文件夹新建工程,建立新工程后观察Openfire所import的包,发现Openfire用了许多开源工具,而这些库都在上文提到的Build目录的lib目录下(当然也可以到网上下载),将Openfire用到的库都添加到这个新建工程的Referenced Libraries中。或者如果这样一个一个添加比较麻烦的话还有一个方法就是从你安装好的Openfire服务器目录下的lib目录中(例如:”D:\Program Files\Openfire\lib”或 “/usr/local/openfire/lib”)找到openfire.jar,打开后将里面的org/jivesoftware删除,重新打包成jar并添加到这个新建工程的Referenced Libraries中,这样省去了很多工作。
第四步:openfire的起始类为org.jivesoftware.openfire.starter.ServerStarter.java 但是直接运行此类却有问题,因为此类是针对Openfire安装包而设计的,此类的功能是将所用到的Jar文件解压并将class文件加载到虚拟机中,而我们要用的却是源代码中我们自己编译好的class文件,所以我们需要一个新的启动类,一个简单的实现如下(当然最好是与ServerStarter.java中的方法一样,用自定义的ClassLoader来将XMPPServer.class加载到虚拟机中):
package org.jivesoftware.openfire.starter;
import org.jivesoftware.openfire.XMPPServer;
public class StandaloneStarter {
public static void main(String[] args) {
XMPPServer server = new XMPPServer();
}}
还有一个关键的一步是Openfire的Home没有设定
在XMPPServer类中有一个locateOpenfire方法,这个方法就是设置openfireHome属性。
具体修改如下:
// and just look for home in a standard sub-dir location and verify
// by looking for the config file
if (openfireHome == null) {
try {
//修改的是下面的代码,将".."替换为其他路径了
openfireHome = verifyHome("C:\\Program Files\\Openfire", jiveConfigName).getCanonicalFile();
}
catch (FileNotFoundException fe) {
// Ignore.
}
catch (IOException ie) {
// Ignore.
}
}
这部分默认是找当前路径,你可以修改它为你安装Openfire的路径,这样问题就解决了