openfire原始碼 部署 常見錯誤
一.部署
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的路徑,這樣問題就可以解決了。
或者,程式碼里加一行如果獲取到的地址為空的話自己手動賦值進去