1. 獲取Openfire 3.5.1源代碼
官方主頁:
http://www.igniterealtime.org/ (1)從官方網(wǎng)站上直接下載官方發(fā)布版本的源代碼Openfire_3_5_1.zip源代碼壓縮包;
但是,2008年4月24官方發(fā)布的源代碼中使用了import testng.xxx語句,所以額外需要下載并導(dǎo)入testng-5.8-jdk15.jar類庫。否則會(huì)提示錯(cuò)誤信息。
(2)也從官方網(wǎng)站上可以下載最新版(nightly builds),如源代碼壓縮包openfire_src_2008-05-31.zip
(3)使用Eclipse的版本控制插件SVN獲取(檢出為),具體步驟為:
* 在eclipse中,選擇Windows->Open Perspective->Other
* 在彈出的窗口中,選擇SVN Repository Exploring, 然后點(diǎn)OK
* 在SVN Repositories 視圖中單擊右鍵,選擇 New->Repository Location...
*在彈出的New Repository Location對(duì)話框的輸入U(xiǎn)RL文本框中輸入:
http://svn.igniterealtime.org/svn/repos/openfire/trunk 然后,單擊Finish. 你將會(huì)看到頁面中出現(xiàn)URL地址
* 展開URL地址與openfire樹形結(jié)構(gòu)
* 在trunk上點(diǎn)擊右鍵,選擇Check Out(檢出為),即可將源代碼保存到您所指定的目錄下。
* 用Create project from existing source新建工程,注意工程名要用openfire。
4. 創(chuàng)建openfire工程
將openfire_src_3_5_1.zip解壓后,目錄下除了READEME.html、LICENSE.html和changelog.html三個(gè)網(wǎng)頁文件之外,有下面四個(gè)子目錄。
build目錄:build目錄下收錄的是生成安裝文件(例如:rpm)所要的一些文件,例如JRE等。
resources目錄:resources目錄下收錄的是一些為實(shí)現(xiàn)國際化(i18n)和本地化的一些編碼文件(例如:英文,中文,法文,德文等)。
documentation目錄:documentation目錄下收錄的是一些關(guān)于Openfire安裝和配置的信息,但最終要的是這里有Openfire開發(fā)的Javadoc。
src目錄:這個(gè)src文件夾就是我們想要的Openfire源代碼了,這下面又有許多文件夾,我們只要Java文件夾就好,這里面實(shí)現(xiàn)的Openfire的核心功能,通過它就可以調(diào)試Openfire。
(1)從現(xiàn)有資源新建項(xiàng)目:File->New->Java Project,在彈出的New Java Project對(duì)話框中輸入工程名:openfire(注意工程名要用openfire,因?yàn)樵创a默認(rèn)的工程名是openfire),選擇Create project from existing source項(xiàng),單擊Browe,找到當(dāng)前工作空間目錄(\workspace目錄)下存放源代碼的openfire文件夾。(推薦初學(xué)者使用這樣方法,因?yàn)榫幾g、打包、調(diào)試等已經(jīng)做好,可以直接使用)
(2)如果您是做二次開發(fā),為了定制自己的服務(wù)器端,就可以采用這樣方法:
* 新建工程:File->New->Project->Java Project,單擊Next,在Project name文本框中輸入工程名:openfire,單擊Finish
* 解壓后得到的openfire_src_3_5_1\src目錄下所有內(nèi)容復(fù)制到新建的工程目錄workspace\openfire下
* 在Package Explorer視圖中,右擊openfire工程,選擇Properties,在彈出的對(duì)話框中選擇Libraries->Add JARs..,把openfire_src_3_5_1/build/lib目錄下的*.jar類庫全部添加進(jìn)來;選擇Source標(biāo)簽頁,Add Folder..,選中src/java目錄前的復(fù)選框,點(diǎn)擊OK,點(diǎn)擊OK按鈕。
(在Eclipse中將此Java文件夾當(dāng)成源代碼文件夾新建工程,建立新工程后觀察Openfire所import的包,發(fā)現(xiàn)Openfire用了許多開源工具,而這些庫都在上文提到的Build目錄的lib目錄下,將Openfire用到的庫都添加到這個(gè)新建工程的Referenced Libraries中。或者如果這樣一個(gè)一個(gè)添加比較麻煩的話還有一個(gè)方法就是從你安裝好的Openfire服務(wù)器目錄下的lib目錄中(例如:”D:\Program Files\Openfire\lib”或“/usr/local/openfire/lib”)找到openfire.jar,打開后將里面的org/jivesoftware刪除,重新打包成jar并添加到這個(gè)新建工程的Referenced Libraries中,這樣就可以省去了很多類似的工作。)
但是這樣新建的openfire項(xiàng)目沒有打包部署,需要開發(fā)者自己完成相應(yīng)的工作。
注意:新建工程之后,可能會(huì)出現(xiàn)一些警告信息,下面對(duì)此予以說明:
對(duì)于警告信息,是沒有關(guān)系的。因?yàn)檫@些警告信息是使用1.5以上版本JDK時(shí)候才出現(xiàn)的,使用JDK1.4是不會(huì)出現(xiàn)這些警告信息的。因?yàn)檫@些代碼中的有些是使用JDK 1.4編寫的,而JDK1.4不支持泛型,而JDK 1.5和JDK1.6是支持泛型的。這些警告信息主要是提示將這些非泛型的代碼修改為更加高級(jí)的方法——泛型,所以這些警告信息是不影響代碼結(jié)果的。如果需要修改為泛型也是可以,使用泛型來處理相關(guān)的集合類。
5. 編譯工程
openfire是用ant構(gòu)建的,所以要先設(shè)置使得eclipse中每次編譯都使用內(nèi)置的ant工具,保證編譯的正確執(zhí)行。同時(shí),要在Eclipse中設(shè)置為使用JDK作為JVM,如果使用JRE作為JVM,編譯就會(huì)失敗。
因?yàn)閛penfire在Windows下是使用install4j打包成.exe格式的安裝文件的,所以需要安裝install4j。否則,在使用ant進(jìn)行編譯的時(shí)候,在ant視圖中可能會(huì)出現(xiàn)警告如下信息:taskdef class com.install4j.install4jtask cannot found。這主要是要安裝用來打包Java應(yīng)用程序的install4j.exe程序,而且將要安裝到其默認(rèn)的安裝路徑C:\Program Files\install4j下。
(1)在eclipse中點(diǎn)擊Window->Show View->Ant,打開Ant窗口;
(2)在Ant 視圖中,單擊右鍵,在彈出的快捷菜單中選擇Add Buildfiles..;
(3)在彈出的對(duì)話框中,展開openfire/build文件夾,選擇build目錄下的build.xml,點(diǎn)擊OK;
(4)在Ant視圖中, 展開Openfire XMPP Server,雙擊 openfire(default)編譯工程
(5)如果在Console視圖中顯示“BUILD SUCCESSFUL”就表示編譯成功。
7. 創(chuàng)建項(xiàng)目Builder
(1)在eclipse的菜單欄中,選擇Run->Open Run Dialog...,在彈出的對(duì)話框左側(cè)的樹形結(jié)構(gòu)中選擇Java Application,單擊右鍵,選擇New創(chuàng)建啟動(dòng)配置。
(2) 在Run窗口的Main選項(xiàng)卡中, 修改Name文本框中的值,改成包含要啟動(dòng)的類的工程名openfire
(3)在Run窗口的Main選項(xiàng)卡中,點(diǎn)Browse按鈕,選擇openfire
(4)在Run窗口的Main選項(xiàng)卡中,點(diǎn)Search按鈕,選擇Main class為
org.jivesoftware.openfire.starter.ServerStarter,單擊Apply按鈕。(這是openfire的啟動(dòng)類)
(5)點(diǎn)擊進(jìn)入Arguments選項(xiàng)卡,在VM arguments文本框中輸入
-DopenfireHome="${workspace_loc:openfire}/target/openfire"
單擊Apply按鈕。這個(gè)是用于eclipse執(zhí)行java命令時(shí)傳遞的參數(shù),這樣openfire程序可以通過System.getProperty(“openfireHome”)得到openfire的本地位置。
(6)點(diǎn)擊進(jìn)入Classpath選項(xiàng)卡,選中User Entries,這樣Advanced...就處于可用狀態(tài);點(diǎn)擊Advanced...按鈕,在Advanced Options頁面,選擇Add Folders, 單擊OK。(默認(rèn)情況下,已經(jīng)將工程openfire添加到了這里,而不需要進(jìn)行該項(xiàng)操作,如果有多個(gè)工程的時(shí)候才需要執(zhí)行該項(xiàng)操作。)
選擇openfire\src\i18n, 點(diǎn)OK按鈕將這個(gè)文件夾加入到Classpath選項(xiàng)卡中;同樣的方式把openfire\src\resources目錄下的jar文件夾也加到Classpath選項(xiàng)卡中。
(11)在Common選項(xiàng)卡中,勾選Run復(fù)選框,單擊Apply按鈕。
設(shè)置完畢,這樣以后在run這個(gè)工程的時(shí)候就會(huì)按照正確的配置進(jìn)行了,debug的設(shè)置和run的設(shè)置類似,不再多說。
8. 運(yùn)行并測試編譯結(jié)果(openfire服務(wù)器)
(1)在Eclipse菜單中,單擊Run->Run(或快捷方式Ctrl+F11),在Console試圖中出現(xiàn)如下所示的信息。
(2)在Web瀏覽器中,輸入
http://127.0.0.1:9090/,如果可以出現(xiàn)配置的openfire的頁面,就表示openfire編譯、運(yùn)行成功。
9. 自己定制openfire服務(wù)器時(shí),在Eclipse對(duì)openfire源代碼進(jìn)行部署
參考網(wǎng)址:
http://blog.csdn.net/racingtom/archive/2007/09/27/1803908.aspx openfire的起始類為org.jivesoftware.openfire.starter.ServerStarter.java,但是直接運(yùn)行此類卻有問題,因?yàn)榇祟愂轻槍?duì)Openfire安裝包而設(shè)計(jì)的,此類的功能是將所用到的JAR文件解壓并將class文件加載到虛擬機(jī)中,而我們要用的卻是源代碼中我們自己編譯好的class文件。所以,我們需要一個(gè)新的啟動(dòng)類。
(1)一個(gè)簡單的實(shí)現(xiàn)方法就是把src/java下的東西復(fù)制到我創(chuàng)建的java project下的src里了,并修改org.jivesoftware.openfire.starter包中ServerStarter.java類的源代碼,具體如下(當(dāng)然最好是與ServerStarter.java中的方法一樣,用自定義的ClassLoader來將XMPPServer.class加載到虛擬機(jī)中)
package org.jivesoftware.openfire.starter;
import org.jivesoftware.openfire.XMPPServer;
public class StandaloneStarter {
public static void main(String[] args) {
XMPPServer server = new XMPPServer();
}
}
這樣程序就可以跑起來了,最后的問題就是配置文件路徑的問題。
(2)配置文件路徑
如果文件路徑配置不正確(即Openfire的Home沒有設(shè)定或者設(shè)置不正確),就可能在運(yùn)行時(shí)出現(xiàn)如下所示的問題:
Could not locate home
java.io.FileNotFoundException......
ERROR 12114 [Jive-ERR] ():
java.io.FileNotFoundException: XML properties file does not exist: openfire.xml........
在XMPPServer類中有一個(gè)locateOpenfire方法,這個(gè)方法就是設(shè)置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.
}
}
是在環(huán)境變量設(shè)置了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.
}
}
這部分默認(rèn)是找當(dāng)前文件路徑,你可以修改它為你安裝openfire的路徑,這樣問題就可以解決了。
(3)將新建的工程目錄下src/web/WEB-INF/classes/openfire_init.xml導(dǎo)入到eclipse的查詢路徑里,如將src/web/WEB-INF/classes目錄作為eclipse的源目錄,這樣openfire_init.xml自動(dòng)copy到$openfire_home/classses下面,將openfire_init.xml中的openfireHome設(shè)置為$openfire_home
修改org.jivesoftware.openfire.starter.ServerStarter中的如下兩個(gè)field,
private static final String DEFAULT_LIB_DIR = "../lib";
private static final String DEFAULT_ADMIN_LIB_DIR = "../plugins/admin/webapp/WEB-INF/lib";
改成:
private static final String DIR_PREFIX = "$openfire_home";
// to be your own openfire_home
private static final String DEFAULT_LIB_DIR = DIR_PREFIX + "lib";
private static final String DEFAULT_ADMIN_LIB_DIR = DIR_PREFIX + "plugins/admin/webapp/WEB-INF/lib";
現(xiàn)在還不知道這里為什么要這樣做?????
10. 打包openfire編譯結(jié)果
(1)編譯成功之后,可以將openfire打包,以便安裝和使用。
(2)在源碼里面有一個(gè)文件夾里有個(gè)打包的圖標(biāo),雙擊那個(gè)圖標(biāo),install4j就會(huì)讀取你在build.xml文件里的信息、在里面完成做界面等打包工作。