openfire在配置完成后,启动时无法正常启动。报错信息如下:
log4j:WARN No appenders could be found for logger (org.jivesoftware.util.Log).
log4j:WARN Please initialize the log4j system properly.
Could not locate home
java.io.FileNotFoundException at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:874) at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:347) at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:468) at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:212) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:113) at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:58)
...
这种情况是由于源码中配置的路径错误引起的,请打开文件 org.jivesoftware.openfire.XMPPServer,找到如下图代码块:
private void locateOpenfire() throws FileNotFoundException {
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.
}
}
// 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("", jiveConfigName).getCanonicalFile();
}
catch (FileNotFoundException fe) {
// Ignore.
}
catch (IOException ie) {
// Ignore.
}
}
定位到这一行,:
openfireHome = verifyHome("..", jiveConfigName).getCanonicalFile();
verifyHome方法的第一个参数,这里配置的就是相对的路径 "..", 而我们重新编译的时候,配置到的路径不是这里,那么就要根据你配置的路径来修改项目路径的地址。
openfireHome = verifyHome("你的openfire_src项目编译后的openfire路径", jiveConfigName).getCanonicalFile();
我的是这样:
openfireHome = verifyHome("D:\\openfire_src\\openfire_src\\target\\openfire", jiveConfigName).getCanonicalFile();
修改成功后重新编译并重启,问题解决。openfire正常启动成功。