一.部署
1 解压openfire源码放到workspace下.建立一个java project,名字与解压后源码文件夹名字一样,这样就可以把openfire源码导入到eclipse中2. 使用ant进行编译。
在openfire项目导入进来之后,点击
Window -> Show View -> Ant
然后就会显示出Ant的窗口,在Ant 视图中,单击右键,在弹出的快捷菜单中选择Add Buildfiles
在弹出的对话框中,展开openfire_srcild文件夹,选择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}/target/openfire"
其中${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应用。
4.点击进入Common选项卡中,勾选Run复选框。
点击Apply应用。在进行这些配置之后,就算是基本完工了。
可以直接点击配置框最下方的Run按钮,或者单击菜单栏Run->Run开始跑程序。
二.错误解决1.
导入项目后一直报错原因:缺少jar包解决办法:
将openfire目录下buildb目录下的所有包都通过JAVA BUILDPATH导入到项目
中来,这个时候可能还缺包,接着导入这几个包。导完后可能还缺,缺少的包在openfire目录下的src/plugins中,如果能找到报错的类在哪个包中就直接加进来,否则的话把所有的包都导进来吧。都导完以后就不报错了
2.java.lang.NullPointerException
atorg.jivesoftware.admin.AdminConsole.getAppName(AdminConsole.java:122)
atorg.jivesoftware.openfire.admin.decorators.setup_jsp._jspService(setup_jsp.java:168)
atorg.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
atjavax.servlet.http.HttpServlet.service(HttpServlet.java:820)
atorg.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
atorg.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
atorg.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
atorg.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
atorg.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
atorg.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405atorg.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:192)
atcom.opensymphony.module.sitemesh.filter.PageFilter.applyDecorator(PageFilter.java:156)
atcom.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:59)
atorg.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
atorg.jivesoftware.util.LocaleFilter.doFilter(LocaleFilter.java:66)
atorg.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
atorg.jivesoftware.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:42)
atorg.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
atorg.jivesoftware.admin.PluginFilter.doFilter(PluginFilter.java:70)
atorg.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
atorg.jivesoftware.admin.AuthCheckFilter.doFilter(AuthCheckFilter.java:99)
atorg.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
atorg.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
atorg.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
atorg.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
atorg.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
atorg.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
atorg.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
atorg.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
atorg.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
atorg.mortbay.jetty.Server.handle(Server.java:324)
atorg.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
atorg.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
atorg.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
atorg.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
atorg.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
atorg.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
atorg.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Poweredby 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 = "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的路径,这样问题就可以解决了。
或者,代码里加一行如果获取到的地址为空的话自己手动赋值进去