1.關於插件的目錄結構
這個網上的資料很多,但是我覺得要看懂也不太容易,我這里上一個包括了jsp和servlet的圖,希望大家能馬上看懂:
ME的Navigator視圖下的截圖:
build path配置
這里要注意,如果你的plugin里邊有自己的jsp文件,那最好把整個openfire_src/work/lib下的包引進來,以免ant編譯時找不到jasper類而報錯。當然,這里邊也包含了openfire.jar,插件調用openfire api時就用到了。
至此,你的項目基本該怎么弄,就怎么弄吧。
發個官網上的目錄結構:
2.插件項目的命名
項目的名稱無所謂大小寫,插件名稱也與plugin.xml里邊的name屬性沒絲毫關系,plugin.xml里邊的name屬性只在openfire插件管理界面里邊做顯示用。
但是你的i18n文件命名就要注意了,一定要是%[plugin_name]%_i18n "_" language ".properties"格式。
代碼里獲取插件時的名稱是大小寫無關的。
plugin = (MainPlugin) XMPPServer.getInstance().getPluginManager() .getPlugin("popplugin");
3.去掉openfire的登錄驗證
對於一些安全性不高的插件來說,可能根本並不需要openfire的登錄,那怎么單獨對自己插件的url進行排除呢?接着往下看!
有兩種方法:修改openfire的web.xml或使用AuthCheckFilter.addExclude方法其中一種即可
1)修改openfire的web.xml
這個web.xml出現在openfire的源碼很多地方,了解正確的配置方法很重要。下面展示不同路徑下的web.xml修改說明,取其一即可。
a. 修改/openfire_src/src/web/WEB-INF/web.xml,修改完后,記得還要用ant編譯一次並重啟才能生效。
b. 修改/openfire_src/target/openfire/plugins/admin/webapp/WEB-INF/web.xml
修改完后,直接重啟即可生效,本方法同樣適用於安裝版的openfire
<filter> <filter-name>AuthCheck</filter-name> <filter-class>org.jivesoftware.admin.AuthCheckFilter</filter-class> <init-param> <param-name>excludes</param-name> <param-value> popplugin/*,login.jsp,index.jsp?logout=true,setup/index.jsp,setup/setup-*,.gif,.png,error-serverdown.jsp,setup/clearspace-integration-prelogin.jsp </param-value> </init-param> </filter>
url的匹配規則比較復雜,有興趣的同學可以去看AuthCheckFilter類源碼,如果要測試自己的pattern對不對,可以使用org.jivesoftware.admin.AuthCheckFilterTest類執行JUnitTest試試,如自己加上一段:
assertTrue(AuthCheckFilter.testURLPassesExclude("popplugin/sendmessage", "popplugin*")); assertTrue(AuthCheckFilter.testURLPassesExclude("popplugin/sendmessage", "popplugin/sendmessage"));
2)使用AuthCheckFilter.addExclude方法
調用該方法和配置web.xml的效果是完全一樣的,個人建議用此方法,因為本方法綠色安全、無污染,不修改和破壞原生openfire代碼。
這個方法可以在servlet的init方法或plugin的initializePlugin方法中調用。
個人建議在servlet的init方法中調用,因為servlet的init方法比plugin的initializePlugin方法更早初始化,這個問題在“插件初始化順序”會講到。
使用完后記得removeExclude一下,有始有終嘛。
@Override public void init() throws ServletException { System.out.println("UserMgrServlet init...."); AuthCheckFilter.addExclude("popplugin/usermgr*"); AuthCheckFilter.addExclude("popplugin/usermgr/*"); } @Override public void destroy() { System.out.println("UserMgrServlet destroy...."); // Release the excluded URL AuthCheckFilter.removeExclude("popplugin/usermgr*"); AuthCheckFilter.removeExclude("popplugin/usermgr/*"); }
4.如何編譯自己的openfire插件
比較流行的一篇文章《一步一步開發自己的openfire插件》里,用的是自己寫的ant腳本,本人不推薦,除非你對ant腳本非常熟悉。
我建議的做法是:
先把openfire源代碼下載下來並成功用build.xml編譯部署;
將自己的plugin項目copy到/openfire_src/src/plugins下;
執行openfire自帶的build.xml,執行命令如下:
ant -f build.xml -Dplugin=插件名字 plugin
用自帶的build.xml和源碼編譯的好處是:編譯完后,插件會自動發布更新。
發布完成后,你的plugin就會出現在/openfire_src/target/openfire/plugins/下.
發布后完整的plugin目錄如下:
5.插件初始化順序
1.創建你的plugin對象實例
2.創建你的servlet對象實例
3.調用你的servlet.init()方法
4.調用你的plugin.initializePlugin()方法
這里要注意3和4兩個步驟,不要像我當初一樣,一位先是4,再是3,然后把一些初始化操作放到4中去,結果在servlet調用的時候出現了空指針異常。
6.插件的日志
最后,再配上日志,你的插件環境基本就搭建好了。剩下的就是添加功能了,這個相信對各位來說就不成問題了。
1.將log4j.jar添加進你的plugin的lib目錄下,並添加進classpath。
2.需要日志的java類中添加日志代碼
3.找到openfire的log4j.xml配置文件,目錄為:openfire_src\target\openfire\lib\log4j.xml,源代碼的路徑就是:/openfire_src/work/lib/log4j.xml
4.為自己的package和class配置獨立的日志。如果不修改log4j.xml,則openfire會將你的日志輸出到openfire_src\target\openfire\logs相應的級別日志下。
7.插件訪問自己的i18n屬性
LocaleUtils.getLocalizedString("popplugin.destroyPlugin", "popplugin")
第一個參數是i18n配置文件中的key,第二個是插件名稱,與加載插件時的名稱一致。