1. 程式人生 > >openfire原始碼 部署 常見錯誤

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:405

       atorg.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的路徑,這樣問題就可以解決了。

或者,程式碼里加一行如果獲取到的地址為空的話自己手動賦值進去