一. 部署
1解压openfire源码放到workspace下.建立一个java project,名字与解压后源码文件夹名字一样,这样就可以把openfire源码导入到eclipse中 2.使用ant进行编译。
在openfire项目导入进来之后,点击 Window -> Show View -> Ant
然后就会显示出Ant的窗口,在Ant 视图中,单击右键,在弹出的快捷菜单中选择Add Buildfiles
在弹出的对话框中,展开openfire_src/build文件夹,选择build目录下的build.xml 接下来双击执行openfire[default] (带一个三角符号的那个) 在控制台中显示“BUILD SUCCESSFUL” 那么就表示编译成功,
3.设置启动项目
点击openfire_src项目,在菜单栏中选择Run->Open Run Dialog (Or Run->Run Configurations)
弹出一个对话框,在左侧菜单中右键点击Java Application,选择New创建启动配置 在Run窗口的Main选项卡中, 修改最上面Name文本框中的值,改成包含要启动的类的工程名openfire_src
(没什么用,就是一个标识,随便起名字。) 在Run窗口的Main选项卡中, project框中填写:openfire_src
Main class 填写:org.jivesoftware.openfire.starter.ServerStarter 点击Apply应用。
点击进入Arguments选项卡,在上面那个框(VM arguments:)中填写 -DopenfireHome=\
其中${workspace_loc:openfire_src} 中的 openfire_src 要根据你的项目名来进行同步修改。 点击Apply应用。
点击进入Classpath选项卡,选中User Entries,然后点击右侧的Advanced按钮,会弹出一个小框,选择Add Folders,单击OK。
选择 openfire_src\\src\\i18n点OK 按钮将这个文件夹加入到Classpath选项卡中 选择 openfire_src\\src\\resources 目录也加到 Classpath选项卡中
点击Apply应用。
5.点击进入Common选项卡中,勾选Run复选框。 点击Apply应用。
在进行这些配置之后,就算是基本完工了。
可以直接点击配置框最下方的Run按钮,或者单击菜单栏Run->Run开始跑程序。
二.错误解决
1.导入项目后一直报错 原因:缺少jar包
解决办法:将openfire目录下build/lib目录下的所有包都通过JAVA BUILDPATH导入到项目
中来,这个时候可能还缺包,接着导入这几个包。导完后可能还缺,缺少的包在openfire目录下的src/plugins中,如果能找到报错的类在哪个包中就直接加进来,否则的话把所有的包都导进来吧。都导完以后就不报错了
2. java.lang.NullPointerException
at org.jivesoftware.admin.AdminConsole.getAppName(AdminConsole.java:122) at org.jivesoftware.openfire.admin.decorators.setup_jsp._jspService(setup_jsp.java:168) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:192)
at
com.opensymphony.module.sitemesh.filter.PageFilter.applyDecorator(PageFilter.java:156)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:59) at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.jivesoftware.util.LocaleFilter.doFilter(LocaleFilter.java:66)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at
org.jivesoftware.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:42) at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.jivesoftware.admin.PluginFilter.doFilter(PluginFilter.java:70)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.jivesoftware.admin.AuthCheckFilter.doFilter(AuthCheckFilter.java:99) at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) at
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) Powered by Jetty://
这时因为是文件路径所导致的问题,需要将admin-sidebar.xml和
openfire_i18n_en.properties这2个文件直接放在openfire\\bin目录下即可解决这个问题。 如果再次出现,这样的问题,就需要将openfire目录下的你把openfire下的work 和target文件都删除了,然后重新发布一个。因为web的内容不会自动更新的,只有.class会自动更新。
3.如果文件路径配置不正确(即Openfire的Home没有设定或者设置不正确),就可能在运行时出现如下所示的问题: Could not locate home
java.io.FileNotFoundException......
ERROR 12114 [Jive-ERR] ():
java.io.FileNotFoundException: XML properties file does not exist: openfire.xml........
在XMPPServer类中有一个locateOpenfire方法,这个方法就是设置openfireHome属性。 第1部分的代码如下:
String jiveConfigName = \// First, try to load it openfireHome as a system property. if (openfireHome == null) {
String homeProperty = System.getProperty(\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(\}
catch (FileNotFoundException fe) { // Ignore. }
catch (IOException ie) { // Ignore. } }
这部分默认是找当前文件路径,你可以修改它为你安装openfire的路径,这样问题就可以解决了。
或者,代码里加一行如果获取到的地址为空的话自己手动赋值进去