Openfire Plugin开发指南(一)

一、简介

Openfire plugin使得Openfire自身的功能得到了很好的扩展和增强。这篇文档旨在引导开发者如何进行Openfire plugin的开发。

二、plugin的结构

plugin的源码放置在Openfire源码根目录的plugins目录下。当plugin以jar包或者war包的形式部署了之后,它将会自动解压成原始的文件夹层级结构,类似的plugin目录结构如下:

Plugin Structure

myplugin/	
|- plugin.xml <- Plugin定义文件	
|- readme.html <- 可选,插件说明文件,直接呈现给最终的用户阅读	
|- changelog.html <- 可选,插件变更日志文件,直接呈现给最终的用户阅读	
|- logo_small.gif <- 可选,插件的小号Logo图片(16x16),只支持.gif和.png格式	
|- logo_large.gif <- 可选,插件的大号Logo图片(32x32),只支持.gif和.png格式	
|- classes/ <- 插件所需要的资源文件 (类似地,例如插件的属性配置文件)	
|- database/ <- 可选,插件的数据库模型文件,可内置包含数据库版本升级的模型文件	
|- i18n/ <- 可选,插件的i18n多语言支持文件	
|- lib/ <- 插件所依赖的库(即JAR包)	
|- web <- 可选,插件的控制台页面相关文件	
|- WEB-INF/
|- web.xml <- 生成的web.xml,包含了等待编译的jsp配置
|- web-custom.xml <- 可选,用户自定义的web.xml,包含用户的servlets配置
|- images/ <- 可选,插件的控制台页面所需要的图片资源文件,只支持.gif与.png格式

plugin中的web目录提供的是插件在管理员控制台中的管理功能,下面会撰写更为详细的相关内容。 其中,plugin.xml定义了plugin主要的类,下面是一个例子:

<!-- Sample plugin.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!-- Main plugin class -->
<class>org.example.ExamplePlugin</class>

<!-- Plugin meta-data -->
<name>Example Plugin</name>
<description>This is an example plugin.</description>
<author>Jive Software</author>

<version>1.0</version>
<date>07/01/2006</date>
<url>http://www.igniterealtime. org/projects/openfire/plugins.jsp</url>
<minServerVersion>3.0.0</minServerVersion>
<licenseType>gpl</licenseType>

<!-- Admin console entries -->
<adminconsole>
<!-- More on this below -->
</adminconsole>
</plugin>

以下的这一些元数据字段可以在plugin.xml被设置:

在plugin中还有一些额外的文件,给用户提供了更多的信息(这些文件都放置在了plugin的根目录下):

// plugin的实现例子
package org.example;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import java.io.File;
/**
* A sample plugin for Openfire.
*/
public class ExamplePlugin implements Plugin {
public void initializePlugin(PluginManager manager, File pluginDirectory) {
// Your code goes here
}

public void destroyPlugin() {
// Your code goes here
}
}

常用的plugin最佳实践

在选择一个插件的包名之时,我们推荐可以选择一些具备唯一性的标识,类似地,可以选用你的自定义字符串或者是组织名称来尽可能地避免包或者类命名的冲突。

例如,假设每个人使用的包名都是org.example.PluginName,就算是PluginName是不相同的,但是你依然会遇到这里或那里的类名冲突,这不是玩笑,在集群部署环境之下,该问题尤其突出。