Openfire代码阅读之一--环境配置

JiveSoftware成立于2001年,总部位于美国波特兰。对于JiveSoftware,各位搞IT的专业人士不会陌生,他的Jive论坛写的可是惊天地,泣鬼神。遍布各处的设计模式,让我等是触目惊心,小心肝乱跳。一度“圈内“流行信Jive,得永生”的口号。

设计模式在jive论坛中得到了很好的体现。结合他的源程序和GOF的《设计模式》,可以很快的提升自己的程序设计能力。在日常的程序开发过程中,可以很自然运用一些设计模式,工厂模式,监听者模式,策略模式等,可以使自己的程序具备很好的兼容性,稳定性,扩展性。。。。好吧,学习完设计模式可以让你的老板给你加工资,可以让你们公司漂亮的前台小姐和你去全国最a大的连锁餐饮---沙县小吃去约会。

Openfire也是这个公司的一个开源的XMPP服务器程序,笔者稍微看过几次,每次都有不同的感想。于是把他记录下来,以后慢慢温故。

 

1. Java/svn/Eclipse的安装

算了,地球人都会安装,不作介绍了。

 

2. 代码下载:


安装好了svn以后,可以通过


svn co http://svn.igniterealtime.org/svn/repos/openfire/trunk openfire 

 

取得最新的源代码,由于时间的关系,我无法穿越,下载的是"revision 11665"这个版本,后续的分析可能会改变版本,但是"who care"?我们是学习的,又不是开发商业程序的。能说明问题就好。

 

以下以[openfireSourceHome] 代替你本机的源代码目录。


3. Eclipse 设置。

 

3.1 "File"-->"New Java Project"

 

 

选中”Create project from existing source",然后“Browse"到你的代码目录, 然后一路”Next",直到"Finish"

 

3.2 编译Openfire

 

打开"Ant"这个View ("Window"-->"Show View"-->"Ant"), 在ant view里面右键选择"Add Buildfiles", 打开文件的目录选择[openfireSourceHome]/build/build.xml

 

 

忽略我上面的openfire目录吧,把你的注意力放在openfire1目录。因为我很懒,不想删掉我建立的openfire工程,甚至我都不想打马赛克,虽然这样对于淫荡的人就没有诱惑性。再勤劳你能有小红花戴?

 

因为build.xml默认的target就是编译openfire整个文件,所以直接双击Ant View里面的标题就开始编译程序了。

 

什么?编译不通过?不可能的,你什么单位的?你替领导说话还是替程序员说话?

 

3.3 建立调试环境

 

上面建立的环境是可以编译,打包和部署的,不过不方便调试,为了调试,需要设置一下项目的一些属性

 

"Run"-->"Run Configurations" -->"Java Application" 新建立一个,在"Main“这个标签里面作如下设置:

 

 

选中"Arguments"标签,作如下设置:

 

 

注意我的设置和后面给的参考资料,openfire官方的设置有点不同,他的arguments设置的是 -DopenfireHome="$/target/openfire" 可是在我的机器上面就是编译不成功,所以我改了一下。

 

因为一些程序的资源目录分散在几个不同的目录下,把他加入进来。 “ Classpath"-->"User Entries"---> Advanced-->"Add Folders"-->然后选择你的i18n目录

 

同样的步骤,再次分别添加” resources/jar"目录和"build/lib/dist"目录,添加好以后,会有如下显示:

 

 

 

为了方便运行,分别在common里面把“Debug","Run"勾上。

 

 

3.4 运行:

 

在"Run"-->"Run History"里面就可以看到你刚才配置的"openfire"选项,直接选中就可以运行了。

 

如果你想调试怎么办,我考,你不会去"Run"-->"Debug History"去看看?

 

基本环境配置就完成了,下一次,我会记录Openfire的模块化设计的读后感。

 

官方的Eclipse+openfire+svn配置说明:

 

http://www.igniterealtime.org/community/docs/DOC-1020


[root@yfw ~]# cd /opt/openfire/bin [root@yfw bin]# kill -9 1183108 [root@yfw bin]# lsof -i :9090 || echo "Port 9090 is now free" COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1185283 openfire 151u IPv6 18970472 0t0 TCP *:websm (LISTEN) [root@yfw bin]# systemctl status openfireopenfire.service - OpenFire XMPP Server Loaded: loaded (/etc/systemd/system/openfire.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2025-11-15 15:23:53 CST; 1min 39s ago Process: 1158688 ExecStop=/opt/openfire/bin/stop.sh (code=exited, status=0/SUCCESS) Main PID: 1185283 (java) Tasks: 34 (limit: 23712) Memory: 180.5M CGroup: /system.slice/openfire.service └─1185283 /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java -server -Xms64m -Xm> Nov 15 15:23:53 yfw.szrengjing.com systemd[1]: Started OpenFire XMPP Server. Nov 15 15:23:53 yfw.szrengjing.com start.sh[1185282]: Starting OpenFire server using Java: /usr/lib/jvm/j> Nov 15 15:23:53 yfw.szrengjing.com start.sh[1185282]: OpenFire started successfully (PID 1185283) Nov 15 15:23:53 yfw.szrengjing.com start.sh[1185282]: Log output: tail -f /opt/openfire/logs/nohup.out Nov 15 15:23:53 yfw.szrengjing.com start.sh[1185282]: Web Console: http://192.168.0.142 172.18.0.1 172.23> [root@yfw bin]# sudo systemctl stop openfire [root@yfw bin]# lsof -i :9090 || echo "Port 9090 is now free" Port 9090 is now free [root@yfw bin]# rm -f /opt/openfire/logs/openfire.pid [root@yfw bin]# > /opt/openfire/logs/nohup.out [root@yfw bin]# sudo systemctl start openfire [root@yfw bin]# systemctl status openfireopenfire.service - OpenFire XMPP Server Loaded: loaded (/etc/systemd/system/openfire.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2025-11-15 15:28:48 CST; 11s ago Process: 1186273 ExecStop=/opt/openfire/bin/stop.sh (code=exited, status=0/SUCCESS) Main PID: 1186448 (java) Tasks: 37 (limit: 23712) Memory: 163.4M CGroup: /system.slice/openfire.service └─1186448 /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java -server -Xms64m -Xm> Nov 15 15:28:48 yfw.szrengjing.com systemd[1]: Started OpenFire XMPP Server. Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Starting OpenFire server using Java: /usr/lib/jvm/j> Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: OpenFire started successfully (PID 1186448) Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Log output: tail -f /opt/openfire/logs/nohup.out Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Web Console: http://192.168.0.142 172.18.0.1 172.23> [root@yfw bin]# journalctl -u openfire.service -f -- Logs begin at Fri 2025-11-14 14:13:59 CST. -- Nov 15 15:28:06 yfw.szrengjing.com stop.sh[1186273]: Stopping OpenFire (PID 1185283)... Nov 15 15:28:06 yfw.szrengjing.com systemd[1]: openfire.service: Main process exited, code=exited, status=143/n/a Nov 15 15:28:07 yfw.szrengjing.com stop.sh[1186273]: Stopped. Nov 15 15:28:07 yfw.szrengjing.com systemd[1]: openfire.service: Failed with result 'exit-code'. Nov 15 15:28:07 yfw.szrengjing.com systemd[1]: Stopped OpenFire XMPP Server. Nov 15 15:28:48 yfw.szrengjing.com systemd[1]: Started OpenFire XMPP Server. Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Starting OpenFire server using Java: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: OpenFire started successfully (PID 1186448) Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Log output: tail -f /opt/openfire/logs/nohup.out Nov 15 15:28:48 yfw.szrengjing.com start.sh[1186447]: Web Console: http://192.168.0.142 172.18.0.1 172.23.0.1 172.17.0.1 172.19.0.1 172.20.0.1:9090 ^C [root@yfw bin]# ls -l /opt/openfire/conf/security.xml ls: cannot access '/opt/openfire/conf/security.xml': No such file or directory [root@yfw bin]# sudo su - openfire -s /bin/bash -c ' > cat > /opt/openfire/conf/security.xml << EOF > <?xml version="1.0" encoding="UTF-8"?> > <!-- > security.xml - 默认安全配置文件 > 用于 OpenFire 首次启动时加载管理员控制台和 SASL 设置 > --> > <jive> > <adminConsole> > <!-- Web 管理控制台端口 --> > <port>9090</port> > <!-- HTTPS 安全端口(可选) --> > <securePort>9091</securePort> > <!-- 是否启用安全连接 --> > <secure>false</secure> > </adminConsole> > <sasl> > <!-- 启用 SASL 认证机制 --> > <active>true</active> > </sasl> > </jive> > EOF > ' ✅ Environment loaded for openfire PATH = /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/lib/jvm/java-11-openjdk/bin:/opt/maven/bin:/usr/local/ffmpeg/bin:/opt/spark/bin JAVA_HOME = /usr/lib/jvm/java-11-openjdk [root@yfw bin]# chown -R openfire:openfire /opt/openfire/conf [root@yfw bin]# chmod 644 /opt/openfire/conf/security.xml [root@yfw bin]# ls -l /opt/openfire/conf/security.xml -rw-r--r-- 1 openfire openfire 544 Nov 15 15:33 /opt/openfire/conf/security.xml [root@yfw bin]# sudo systemctl restart openfire [root@yfw bin]# journalctl -u openfire.service -f --since "30 seconds ago" -- Logs begin at Fri 2025-11-14 14:13:59 CST. -- Nov 15 15:34:33 yfw.szrengjing.com systemd[1]: Stopping OpenFire XMPP Server... Nov 15 15:34:33 yfw.szrengjing.com stop.sh[1187749]: Stopping OpenFire (PID 1186448)... Nov 15 15:34:33 yfw.szrengjing.com systemd[1]: openfire.service: Main process exited, code=exited, status=143/n/a Nov 15 15:34:34 yfw.szrengjing.com stop.sh[1187749]: Stopped. Nov 15 15:34:34 yfw.szrengjing.com systemd[1]: openfire.service: Failed with result 'exit-code'. Nov 15 15:34:34 yfw.szrengjing.com systemd[1]: Stopped OpenFire XMPP Server. Nov 15 15:34:34 yfw.szrengjing.com systemd[1]: Started OpenFire XMPP Server. Nov 15 15:34:34 yfw.szrengjing.com start.sh[1187757]: Starting OpenFire server using Java: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java Nov 15 15:34:34 yfw.szrengjing.com start.sh[1187757]: OpenFire started successfully (PID 1187759) Nov 15 15:34:34 yfw.szrengjing.com start.sh[1187757]: Log output: tail -f /opt/openfire/logs/nohup.out Nov 15 15:34:34 yfw.szrengjing.com start.sh[1187757]: Web Console: http://192.168.0.142 172.18.0.1 172.23.0.1 172.17.0.1 172.19.0.1 172.20.0.1:9090 ^C [root@yfw bin]# sudo su - openfire -s /bin/bash -c ' > cat > /opt/openfire/conf/openfire.xml << EOF > <?xml version="1.0" encoding="UTF-8"?> > <jive> > <adminConsole> > <!-- 必须显式设置加密算法,防止 NullPointer --> > <encryption>none</encryption> > <port>9090</port> > <securePort>9091</securePort> > <secure>false</secure> > </adminConsole> > > <!-- 默认语言环境 --> > <locale>zh_CN</locale> > > <!-- 内嵌数据库(Derby)用于测试 --> > <database> > <defaultProvider> > <driver>org.apache.derby.jdbc.EmbeddedDriver</driver> > <serverURL>jdbc:derby:/opt/openfire/embedded-db;create=true</serverURL> > </defaultProvider> > </database> > </jive> > EOF > ' ✅ Environment loaded for openfire PATH = /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/lib/jvm/java-11-openjdk/bin:/opt/maven/bin:/usr/local/ffmpeg/bin:/opt/spark/bin JAVA_HOME = /usr/lib/jvm/java-11-openjdk [root@yfw bin]# chown -R openfire:openfire /opt/openfire/conf [root@yfw bin]# chmod 644 /opt/openfire/conf/openfire.xml [root@yfw bin]# sudo systemctl restart openfire [root@yfw bin]# journalctl -u openfire.service -f --since "30 seconds ago" -- Logs begin at Fri 2025-11-14 14:13:59 CST. -- Nov 15 15:37:42 yfw.szrengjing.com systemd[1]: Stopping OpenFire XMPP Server... Nov 15 15:37:42 yfw.szrengjing.com stop.sh[1188689]: Stopping OpenFire (PID 1187759)... Nov 15 15:37:42 yfw.szrengjing.com systemd[1]: openfire.service: Main process exited, code=exited, status=143/n/a Nov 15 15:37:43 yfw.szrengjing.com stop.sh[1188689]: Stopped. Nov 15 15:37:43 yfw.szrengjing.com systemd[1]: openfire.service: Failed with result 'exit-code'. Nov 15 15:37:43 yfw.szrengjing.com systemd[1]: Stopped OpenFire XMPP Server. Nov 15 15:37:43 yfw.szrengjing.com systemd[1]: Started OpenFire XMPP Server. Nov 15 15:37:43 yfw.szrengjing.com start.sh[1188697]: Starting OpenFire server using Java: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java Nov 15 15:37:43 yfw.szrengjing.com start.sh[1188697]: OpenFire started successfully (PID 1188698) Nov 15 15:37:43 yfw.szrengjing.com start.sh[1188697]: Log output: tail -f /opt/openfire/logs/nohup.out Nov 15 15:37:43 yfw.szrengjing.com start.sh[1188697]: Web Console: http://192.168.0.142 172.18.0.1 172.23.0.1 172.17.0.1 172.19.0.1 172.20.0.1:9090 ^C [root@yfw bin]# tail -f /opt/openfire/logs/nohup.out Openfire 5.0.2 [2025年11月15日 下午3:37:44] 管理控制台正在侦听 http://ecs-124-71-230-244.compute.hwclouds-dns.com:9090 ^C [root@yfw bin]# sudo su - openfire -s /bin/bash -c ' > cat > /opt/openfire/conf/openfire.xml << EOF > <?xml version="1.0" encoding="UTF-8"?> > <!-- > OpenFire 配置文件 - 必须符合规范格式 > --> > <jive> > <adminConsole> > <!-- 显式声明加密方式,防止 NullPointer --> > <encryption>none</encryption> > <port>9090</port> > <securePort>9091</securePort> > <secure>false</secure> > </adminConsole> > > <!-- 设置语言环境 --> > <locale>en_US</locale> > > <!-- 使用嵌入式 Derby 数据库 --> > <database> > <defaultProvider> > <driver>org.apache.derby.jdbc.EmbeddedDriver</driver> > <serverURL>jdbc:derby:/opt/openfire/embedded-db;create=true</serverURL> > <username></username> > <password></password> > </defaultProvider> > </database> > > <!-- 强制初始化加密算法属性 --> > <setup>true</setup> > </jive> > EOF > ' ✅ Environment loaded for openfire PATH = /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/lib/jvm/java-11-openjdk/bin:/opt/maven/bin:/usr/local/ffmpeg/bin:/opt/spark/bin JAVA_HOME = /usr/lib/jvm/java-11-openjdk [root@yfw bin]# # 创建数据库目录 [root@yfw bin]# sudo mkdir -p /opt/openfire/embedded-db [root@yfw bin]# [root@yfw bin]# # 确保 openfire 用户可写 [root@yfw bin]# sudo chown -R openfire:openfire /opt/openfire/conf /opt/openfire/embedded-db /opt/openfire/logs [root@yfw bin]# sudo chmod -R 755 /opt/openfire/conf [root@yfw bin]# sudo chmod 644 /opt/openfire/conf/*.xml [root@yfw bin]# # 清理旧状态 [root@yfw bin]# sudo systemctl stop openfire [root@yfw bin]# sleep 3 [root@yfw bin]# rm -f /opt/openfire/logs/openfire.pid [root@yfw bin]# > /opt/openfire/logs/nohup.out [root@yfw bin]# [root@yfw bin]# # 重新启动 [root@yfw bin]# sudo systemctl start openfire [root@yfw bin]# tail -f /opt/openfire/logs/nohup.out at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) [?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) [?:?] at java.lang.Class.newInstance(Class.java:645) [?:?] at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) [startup.jar:5.0.2] at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) [startup.jar:5.0.2] Caused by: java.sql.SQLException: ConnectionManager.getConnection() failed to obtain a connection after 11 attempts. The exception from the last attempt is as follows: java.sql.SQLException: Check JDBC properties; data source was not be initialised at org.jivesoftware.database.DbConnectionManager.getConnection(DbConnectionManager.java:204) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.verifyDataSource(XMPPServer.java:1010) ~[xmppserver-5.0.2.jar:5.0.2] ... 11 more 启动服务器时出错。有关详细信息,请查看日志文件。
最新发布
11-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值