最近在做基于android的即时通讯软件,晚上也看了不少方法,曾想尝试用百度云推送来简单实现。无奈现在百度云也开始收费了,遂只好自己搭建服务器了。后来了解到,基于XMPP通讯协议确实有这么一款免费开源服务武器——openfire.所以就抱着试试的心态来搞搭建测试了。
由于自己还有其他拓展功能,因此想做一下二次开发,就把源码在本地部署了下,期间遇到不少问题,记录下来以供参考。
1.openfire的安装
这个算是最基础的啦,去官网下载openfire,按步骤安装,注意帐号密码啥的。这些有很多博客里都有介绍,就不一一说明了。贴出一个地址,仅供参考。其他系统也类似。
mac搭建openfire服务器教程
2.openfire_src源代码的部署和二次开发
这个是本文的重点,我个人搭建的时候消费了点功夫。不过说实话,看明白了其实很简单。但是盲目就开始搭建还是会有点头疼。先贴一下网上看到的两个搭建帖子
Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置(eclipse)
Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置
都介绍得很详细,但是我结合着看就弄混淆了。鄙视一下自己。我这里所说
部署和一些常见问题的解决
。
1.下载openfire_src源代码
openfire_src(进官网,点击download->source->openfire_src.zip)
2.解压
把源代码解压出的openfire_src文件夹放至eclipse workplace(注意:若是变更了解压出来的文件名,则接下来所有用到文件名的地方都要作出相应更改,否则会报错!)
3.把openfire_src文件夹里的三个无用的html文件删除
4.导入项目工程
刚开始我挺费了点功夫,按照第一篇说的来,发现有很多问题。按第二个篇的话,没发现怎么到工程项目。后来才发现没那么麻烦。把解压的项目放进你的工作空间,然后在eclipse中新建java project,注意项目名跟刚刚考进去的一样(openfire_src),然后他自动就会在当前文件夹下建项目,并把你刚刚拷贝过去的文件包含进去。
打开eclipse,新建一个名为openfire_src的Java Project,然后finish
注:此处的默认路径为openfire_src文件夹的绝对路径
5.导入jar包
项目建好后如图所示,其中有几个目录报错,通常是由于缺少3个jar包:coherence.jar、coherence-work.jar、tangosol.jar
如果还有,则
根据自己的提示下载自己需要的包,实在不行就全部下下来都导入到项目当中去.
openfire缺少的包
下载这几个jar包,然后复制到/openfire_src/build/lib目录下,
选中3个新添加的jar包,点击右键,选择Build Path -> Add to Build Path
这时候还有可能会出现以下错误
(1)把jar包编译后还是会有报错,
一种错误可能是没有实现继承父类的抽象方法,解决办法是使用自动修复,即add unimpl......添加抽象方法;
还有一种错误是没有处理异常,同样可以自动修复..
(2)包里边存在 ..类已经被定义(class has already difined)
解决方法,直接删除该类即可。(在其他类里边已经定义有该函数和方法)
6.点击Window -> Show View -> Ant,在Ant中选择Add Buildfiles,将build目录下的build.xml选中,然后ok
7.把Java JDK的lib目录下的tools.jar包拷贝到 Java JRE的lib目录下
jdk/lib (为你当初安装java jdk的路径) -> java jre(安装路径)
8.运行选中的build.xml文件
等待运行,带盖几十秒。运行完成后,刷新项目,目录多出两个文件夹
将target/lib目录下的所有jar包选中,单击右键,选择Build Path –> Add to Build Path
9、选中项目,点击run -> run configurations
10、选择run configurations左边的Java Application,单击右键,选择New
11、选中Main选项卡,点击Browse选择openfire_src项目;单击Search选择ServerStarter - org.jivesoftware.openfire.starter,结果如下
12、选中Arguments选项卡,在VM arguments中填入-DopenfireHome="${workspace_loc:openfire_src}/target/openfire"
13、选中Classpath选项卡,选中User Entries,点击右边的Advanced按钮
14、在弹出的框中选中Add Folders,选中src/i18n文件夹,点击ok
15、重复上一步骤把src/resources选中添加,结果如下:User Entries下多了两个文件夹
16、选中Common选项卡,将Debug和Run打钩,然后点击apply,再点击run
这时候有可能遇到以下错误:
(1)
java.lang.NullPointerException
at org.jivesoftware.admin.AdminConsole.getAppName(AdminConsole.java:122)
这因为是文件路径所导致的问题,需要将admin-sidebar.xml和openfire_i18n_en.properties这2个文件直接放在openfire\bin目录下即可解决这个问题。
如果再次出现,这样的问题,就需要将openfire目录下的你把openfire下的work 和target文件都删除了,然后重新发布一个。因为web的内容不会自动更新的,只有.class会自动更新。
(2)jar multipte .。。。。(jar包重复)
一般是因为后来产生的 target/lib文件下边的jar包与最初导入的build/lib下jar包重复,移出一个即可。
(3)Could not locate home
java.io.FileNotFoundException......
这种情况,是文件路径配置不正确(即Openfire的Home没有设定或者设置不正确)
解决方法
在XMPPServer类中有一个locateOpenfire方法,这个方法就是设置openfireHome属性。
第1部分的代码如下:
String jiveConfigName = "conf" + File.separator + "openfire.xml";
// First, try to load it openfireHome as a system property.
if (openfireHome == null) {
String homeProperty = System.getProperty("openfireHome");
try {
if (homeProperty != null) {
openfireHome = verifyHome(homeProperty, jiveConfigName);
}
}
catch (FileNotFoundException fe) {
// Ignore.
}
}
是在环境变量设置了Openfire的Home的情况下寻找openfire.xml文件
你可以更改第二部分的代码让Openfire找到Home:
// If we still don't have home, let's assume this is standalone
// 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的路径,这样问题就可以解决了。
成功运行结果
在浏览器中输入上图的地址http://127.0.0.1:9090
选择中文,然后继续。服务器设置可直接跳过。数据库设置选择标准数据库连接,点击继续
在数据库设置-标准连接设置界面,选择数据库驱动mysql,更改数据库url,其中需要更改的有服务器ip地址,还有数据库名,建议单独建立一个名为openfire的数据库。输入数据库管理员的账号和密码,下一步。
数据库连接成功后界面,直接点击继续。
管理员账户设置界面,输入管理员的邮箱地址,还有管理员的账号的密码,初始账号为admin。
完成设置,登录到管理控制台,初始账户名admin密码为上一步设置的密码。
登陆成功后显示
检测服务器是否配置成功,到http://www.igniterealtime.org/downloads/index.jsp下载Spark
安装Spark,一路next,然后finish。运行Spark,创建Spark账号
使用创建的账号登陆Spark,登陆成功可在Openfire管理控制台的用户组看到新注册的用户和在线状态