openfire :openfire 不同类型插件的开发示例
2017-09-01 00:00
337 查看
新建一个自己的Javaproject工程,添加的jar包如下:
将jasper-compiler.jar、jasper-runtime.jar、servlet.jar添加到新建的工程中。如果没有jar先不要急,看下面的步骤:
下载后的openfire源码目录是这样的
如果你有ant工具可以用dos命令行的方式,直接运行build目录中的ant脚本,运行脚本后,你会发现有一个target的目录。该目录如下:
在lib目录中可以找到我们需要的jar文件了,将openfire.jar也添加到你的工程中。
如果你没有安装ant你可以用MyEclipse,将openfire源码中的build、documentation、resources目录复制到一个javaProject中,然后在MyEclipse中运行src中的build.xmlant脚本就会出现和上面一样的文件目录。
建议将你的MyEclipse中的openfire源码工程目录设置成这样的
其中,src/plugins/tree是我自己写的插件,现在暂时可以无视。而target就是我们需要的,里面存放了openfire的配置和需要的jar包。Work是工作目录,是一个完整的openfire服务器。如果你还没有下载openfire服务器的话,可以用这个服务器。
了解openfire源码中的插件
我们找一个插件目录看看,主要看看里面的结构,目录结构很重要。因为我们将写好的插件打成jar包后,打包的jar的目录有一定规范结构,不能随便建立其他目录。
这是一个userservice的插件,在src/Java中是我们的插件源代码 ;web目录中则是前端的页面,其中web-custom.xml是配置当前插件的servlet服务器UserServiceServlet配置;changelog.html是修改日志;logo_small.gif是插件图标;plugin.xml是我们配置插件的文件,这个很重要(在这里先提示下);
1、建立自己的插件类,SamplePlugin.java,里面简单的写点内容。
packagecom.hoo.server.plugin;
importjava.io.File;
importorg.jivesoftware.openfire.XMPPServer;
importorg.jivesoftware.openfire.container.Plugin;
importorg.jivesoftware.openfire.container.PluginManager;
/**
*<b>function:</b>openfireserverpluginsample
*@authorhoojo
*@createDate2013-2-28下午05:48:22
*@fileSamplePlugin.java
*@packagecom.hoo.server.plugin
*@projectOpenfirePlugin
*@bloghttp://blog.csdn.net/IBM_hoojo
*@emailhoojo_@126.com
*@version1.0
*/
publicclassSamplePluginimplementsPlugin{
privateXMPPServerserver;
@Override
publicvoidinitializePlugin(PluginManagermanager,FilepluginDirectory){
server=XMPPServer.getInstance();
System.out.println("初始化……安装插件!");
System.out.println(server.getServerInfo());
}
@Override
publicvoiddestroyPlugin(){
System.out.println("服务器停止,销毁插件!");
}
}
比较简单,如果你将插件安装在openfire服务器上的时候,启动服务器一个可以看到初始化的内容,关闭服务器可以看到销毁的内容。
2、配置插件
<?xmlversion="1.0"encoding="UTF-8"?>
<plugin>
<!--Mainpluginclass这里是最重要滴,就是你的插件的全路径-->
<class>com.hoo.server.plugin.SamplePlugin</class>
<!--Pluginmeta-data-->
<name>SimplePlugin</name>
<description>Thisisthemysampleplugin.</description>
<author>hoojo</author>
<version>1.0</version>
<date>28/02/2013</date>
<url>http://localhost:9090/openfire/plugins.jsp</url>
<minServerVersion>3.4.1</minServerVersion>
<licenseType>gpl</licenseType>
<adminconsole>
</adminconsole>
</plugin>
注意上面的class的配置,那个配置是最为重要的,配置的是插件的全路径;name是插件的名称,安装后的插件名称;author是插件作者;lincenseType是协议;adminconsole是配置插件关联的页面的;稍后再讲!
3、可部署的插件包jar的目录结构
这个很重要,目录结构将决定你插件发布的成败。
在编写命令之前,我们可以看看openfire服务器中已经安装的插件的jar包的目录结构,到时候我们也要打包成那样的结构才行的。必须打包成这样的目录结构。
在我机器中的openfire服务器中,插件目录在C:\ProgramFiles\openfire\plugins,里面有一个search.jar插件。提示:当你将一个可以安装的jar安装在openfire后,会被openfire解压成目录结构。就向JavaEE中的war包发布的应用服务器中的效果一样的。
打成可部署的插件jar包(相当于发布的应用服务器的目录结构)的search.jar目录结构如下:
首先看看文件命名,
(1)search.jar:打包的插件的名称,
(2)i18n:118n国际化文件,它主要是我们在插件中的jsp和Java程序中的国际化配置。国际化的配置文件是以插件名称开头_118n.properties或_118n_language.properties;
(3)lib:lib目录是存放插件的src目录的java代码编译后打包的jar,以及jsp编译成servlet的class打包后的jar;带有*-jspc.jar是web目录下的jsp编译成servlet后的class打成的包文件,都是以插件名称开头;WEB-INF/web.xml配置的是*-jspc.jar中的class文件;
(4)web:web目录存放jsp、图片、web.xml内容;
(5)plugin.xml文件名固定的,里面是配置插件的xml内容。
其他的文件都是根目录的;
对照上面插件包的jar,我们看看实际开发中的目录结构:
稍提醒下,如果你的插件中包含servlet,那你需要将它配置在web目录下的WEB-INF/web-custom.xml目录中;这个在以后会经常用到的,比如你提供一个接口给外部程序调用的情况下。目录结构参考:
UserServiceServlet配置在web-custom.xml目录中。
4、编写ant命令,打可部署jar包。如果你不懂ant命令也没关系,你总知道java的基本常用的dos命令。只不过ant就是将dos转换成一个可重复多次调用的命令行。
在工程的根目录中新建一个build目录,新建
build.xml
<projectname="WebappPrecompilation"default="openfire-plugins"basedir=".">
<propertyfile="build.properties"/>
<!--javaservlet相关文件编译jar存放位置-->
<propertyname="java.jar.dir"value="${webapp.path}/java-dist"/>
<!--jspservlet编译后jar存放位置-->
<propertyname="jsp.jar.dir"value="${webapp.path}/jsp-dist/lib"/>
<!--定义javaservlet和jspservlet的jar包名称-->
<propertyname="java.jar"value="${java.jar.dir}/plugin-${plugin.name}.jar"/>
<propertyname="jsp.jar"value="${jsp.jar.dir}/plugin-${plugin.name}-jsp.jar"/>
<!--jspservlet配置到web.xml中-->
<propertyname="plugin.web.xml"value="${webapp.path}/jsp-dist/web.xml"/>
<!--编译jsp并生成相关jar、xml文件-->
<targetname="jspc">
<taskdefclassname="org.apache.jasper.JspC"name="jasper2">
<classpathid="jspc.classpath">
<pathelementlocation="${java.home}/../lib/tools.jar"/>
<filesetdir="${tomcat.home}/bin">
<includename="*.jar"/>
</fileset>
<filesetdir="${tomcat.home}/server/lib">
<includename="*.jar"/>
</fileset>
<filesetdir="${tomcat.home}/common/lib">
<includename="*.jar"/>
</fileset>
<!--
<filesetdir="D:/Workspace/openfire/build/lib">
<includename="**/*.jar"/>
</fileset-->
</classpath>
</taskdef>
<!--编译jsp->servletclass-->
<jasper2javaEncoding="UTF-8"validateXml="false"
uriroot="${plugin.path}/web"
outputDir="${webapp.path}/jsp-dist/src"
package="com.hoo.openfire.plugin.${plugin.name}"/>
<!--编译后的servletclass配置到web.xml文件中-->
<jasper2
validateXml="false"
uriroot="${plugin.path}/web"
outputDir="${webapp.path}/jsp-dist/src"
package="com.hoo.openfire.plugin.${plugin.name}"
webXml="${plugin.web.xml}"/>
</target>
<!--编译jsp并将其打jar包-->
<targetname="compile">
<mkdirdir="${webapp.path}/jsp-dist/classes"/>
<mkdirdir="${webapp.path}/jsp-dist/lib"/>
<mkdirdir="${webapp.path}/jsp-dist/src"/>
<javacdestdir="${webapp.path}/jsp-dist/classes"optimize="off"
encoding="UTF-8"debug="on"failonerror="false"
srcdir="${webapp.path}/jsp-dist/src"excludes="**/*.smap">
<classpath>
<pathelementlocation="${webapp.path}/jsp-dist/classes"/>
<filesetdir="${webapp.path}/jsp-dist/lib">
<includename="*.jar"/>
</fileset>
<pathelementlocation="${tomcat.home}/common/classes"/>
<filesetdir="${tomcat.home}/common/lib">
<includename="*.jar"/>
</fileset>
<pathelementlocation="${tomcat.home}/shared/classes"/>
<filesetdir="${tomcat.home}/shared/lib">
<includename="*.jar"/>
</fileset>
<filesetdir="${tomcat.home}/bin">
<includename="*.jar"/>
</fileset>
</classpath>
<includename="**"/>
<excludename="tags/**"/>
</javac>
<jarjarfile="${jsp.jar}"basedir="${webapp.path}/jsp-dist/classes"/>
</target>
<!--将javaservlet打包成jar-->
<targetname="java-jar">
<mkdirdir="${java.jar.dir}"/>
<jarjarfile="${java.jar}">
<filesetdir="${webapp.path}/bin"includes="**/*.class"/>
</jar>
</target>
<!--生成可部署的插件包-->
<targetname="plug-jar">
<!--插件插件包相关lib、web目录-->
<mkdirdir="${webapp.path}/${plugin.name}/lib"/>
<mkdirdir="${webapp.path}/${plugin.name}/web/WEB-INF"/>
<!--复制jspservlet的jar和javaservlet的相关jar包到插件包的lib目录下-->
<copyfile="${java.jar}"todir="${webapp.path}/${plugin.name}/lib"/>
<copyfile="${jsp.jar}"todir="${webapp.path}/${plugin.name}/lib"/>
<!--将相关的图片、帮助文档、修改日志等文件复制到插件目录下-->
<copytodir="${webapp.path}/${plugin.name}">
<filesetdir="${plugin.path}"includes="*.*"/>
</copy>
<copytodir="${webapp.path}/${plugin.name}/web">
<filesetdir="${plugin.path}/web">
<includename="*"/>
<includename="**/*.*"/>
<excludename="**/*.xml"/>
<excludename="**/*.jsp"/>
</fileset>
</copy>
<!--jspservlet的web复制到插件目录下-->
<copyfile="${plugin.web.xml}"todir="${webapp.path}/${plugin.name}/web/WEB-INF"/>
<copytodir="${webapp.path}/${plugin.name}/web">
<filesetdir="${plugin.path}/web"includes="**/*.xml"/>
</copy>
<!--将国际化相关资源文件复制到插件目录下
<copyfile="${webapp.path}/bin/i18n"todir="${webapp.path}/${plugin.name}"/>
-->
<!--产生可部署插件包-->
<jarjarfile="${webapp.path}/${plugin.name}.jar">
<filesetdir="${webapp.path}/${plugin.name}"includes="**/**"/>
</jar>
</target>
<!--生成没有Web资源的可部署插件包-->
<targetname="java-plug-jar">
<!--插件插件包相关lib、web目录-->
<mkdirdir="${webapp.path}/${plugin.name}/lib"/>
<!--复制javaservlet的相关jar包到插件包的lib目录下-->
<copyfile="${java.jar}"todir="${webapp.path}/${plugin.name}/lib"/>
<!--将相关的图片、帮助文档、修改日志等文件复制到插件目录下-->
<copytodir="${webapp.path}/${plugin.name}">
<filesetdir="${plugin.path}"includes="*.*"/>
</copy>
<!--产生可部署插件包-->
<jarjarfile="${webapp.path}/${plugin.name}.jar">
<filesetdir="${webapp.path}/${plugin.name}"includes="**/**"/>
</jar>
</target>
<!--清理生成的文件-->
<targetname="clean">
<deletefile="${webapp.path}/${plugin.name}.jar"/>
<deletedir="${webapp.path}/${plugin.name}"/>
<deletedir="${webapp.path}/jsp-dist"/>
<deletedir="${webapp.path}/java-dist"/>
</target>
<targetname="all"depends="clean,jspc,compile"/>
<targetname="openfire-plugin"depends="jspc,java-jar"/>
<targetname="openfire-plugins"depends="all,java-jar,plug-jar"/>
<targetname="openfire-plugin-java"depends="clean,java-jar,java-plug-jar"/>
</project>
build.properties文件内容
#tomcathome
tomcat.home=D:/tomcat-5.0.28/tomcat-5.0.28
webapp.path=D:/Workspace/OpenfirePlugin
plugin.name=sample
plugin.path=D\:/Workspace/OpenfirePlugin/src/plugins/sample
注意:这里我没有编写编译java代码到class的步骤,我是直接使用MyEclipse自动编译的bin/class的。如果你没有用MyEclipse或Eclipse,那么你需要将src中的Java代码编译class。
这里需要配置tomcat的目录,我这里是5.0.28的版本。我用tomcat6有些问题,这里主要是用tomcat中的lib库,帮助我们编译jsp。还需要配置你当前工程的所在目录,也就是工程在Eclipse中的目录位置。最后你需要配置插件的名称和插件在工程中的所在目录,这个是在打包的时候,需要将其他的html、image、xml等资源导入的jar内。
因为这里的插件是不带jsp的,所以我们执行clean、java-jar、java-plugin-jar。也就是openfire-plugin-java这个命令即可。执行命令后,你可以看到工作空间的工程目录下多了目录和文件。见图:
java-dist目录里面的就是src/plugin/sample目录中的java代码打成的jar包。具体你可以用zip打开看看。
sample就是我们的插件目录,和sample.jar中的内容是一模一样的。
sample.jar就是将sample目录打成jar包。
5、发布插件
发布插件有2种方式
第一种:直接将插件放置在openfire服务器的plugins目录下。我的是在:C:\ProgramFiles\openfire\plugins目录。重起openfire后你可以看到控制台输出我们插件中输出的内容,并且在C:\ProgramFiles\openfire\plugins目录中可以看到该目录下多了一个sample的目录(openfire可以自动解压jar包)。
当你在关闭服务器的瞬间,也会打印销毁插件的消息。
第二种:在openfire启动的情况下,访问http://localhost:9090/plugin-admin.jsp页面,点击页面下方的uploadplugin完成插件上传操作。
插件按照成功后,访问http://localhost:9090/plugin-admin.jsp页面你就可以看到安装好的插件了。
至此,不带jsp页面的简单插件就编写部署成功了。
在之前的目录下添加文件,目录结构如下:
1、首先建立一个SampleServlet的文件,内容如下
packagecom.hoo.server.plugin;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*<b>function:</b>sampleservlet
*@authorhoojo
*@createDate2013-3-4下午04:15:20
*@fileSampleServlet.java
*@packagecom.hoo.server.plugin
*@projectOpenfirePlugin
*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]*@emailhoojo_@126.com
*@version1.0
*/
publicclassSampleServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=-5404916983906926869L;
@Override
将jasper-compiler.jar、jasper-runtime.jar、servlet.jar添加到新建的工程中。如果没有jar先不要急,看下面的步骤:
下载后的openfire源码目录是这样的
如果你有ant工具可以用dos命令行的方式,直接运行build目录中的ant脚本,运行脚本后,你会发现有一个target的目录。该目录如下:
在lib目录中可以找到我们需要的jar文件了,将openfire.jar也添加到你的工程中。
如果你没有安装ant你可以用MyEclipse,将openfire源码中的build、documentation、resources目录复制到一个
建议将你的MyEclipse中的openfire源码工程目录设置成这样的
其中,src/plugins/tree是我自己写的插件,现在暂时可以无视。而target就是我们需要的,里面存放了openfire的配置和需要的jar包。Work是工作目录,是一个完整的openfire服务器。如果你还没有下载openfire服务器的话,可以用这个服务器。
了解openfire源码中的插件
我们找一个插件目录看看,主要看看里面的结构,目录结构很重要。因为我们将写好的插件打成jar包后,打包的jar的目录有一定规范结构,不能随便建立其他目录。
这是一个userservice的插件,在src/
二、开发简单插件
工程现在的目录机构如下1、建立自己的插件类,SamplePlugin.java,里面简单的写点内容。
packagecom.hoo.server.plugin;
importjava.io.File;
importorg.jivesoftware.openfire.XMPPServer;
importorg.jivesoftware.openfire.container.Plugin;
importorg.jivesoftware.openfire.container.PluginManager;
/**
*<b>function:</b>openfireserverpluginsample
*
*@createDate2013-2-28下午05:48:22
*
*
*
*@blog
*@emailhoojo_@126.com
*@version1.0
*/
publicclassSamplePluginimplementsPlugin{
privateXMPPServerserver;
@Override
publicvoidinitializePlugin(PluginManagermanager,FilepluginDirectory){
server=XMPPServer.getInstance();
System.out.println("初始化……安装插件!");
System.out.println(server.getServerInfo());
}
@Override
publicvoiddestroyPlugin(){
System.out.println("服务器停止,销毁插件!");
}
}
比较简单,如果你将插件安装在openfire服务器上的时候,启动服务器一个可以看到初始化的内容,关闭服务器可以看到销毁的内容。
2、配置插件
注意上面的class的配置,那个配置是最为重要的,配置的是插件的全路径;name是插件的名称,安装后的插件名称;author是插件作者;lincenseType是协议;adminconsole是配置插件关联的页面的;稍后再讲!
3、可部署的插件包jar的目录结构
这个很重要,目录结构将决定你插件发布的成败。
在编写命令之前,我们可以看看openfire服务器中已经安装的插件的jar包的目录结构,到时候我们也要打包成那样的结构才行的。必须打包成这样的目录结构。
在我机器中的openfire服务器中,插件目录在C:\ProgramFiles\openfire\plugins,里面有一个search.jar插件。提示:当你将一个可以安装的jar安装在openfire后,会被openfire解压成目录结构。就向JavaEE中的war包发布的应用服务器中的效果一样的。
打成可部署的插件jar包(相当于发布的应用服务器的目录结构)的search.jar目录结构如下:
首先看看文件命名,
(1)search.jar:打包的插件的名称,
(2)i18n:118n国际化文件,它主要是我们在插件中的jsp和Java程序中的国际化配置。国际化的配置文件是以插件名称开头_118n.properties或_118n_language.properties;
(3)lib:lib目录是存放插件的src目录的java代码编译后打包的jar,以及jsp编译成servlet的class打包后的jar;带有*-jspc.jar是web目录下的jsp编译成servlet后的class打成的包文件,都是以插件名称开头;WEB-INF/web.xml配置的是*-jspc.jar中的class文件;
(4)web:web目录存放jsp、图片、web.xml内容;
(5)plugin.xml文件名固定的,里面是配置插件的xml内容。
其他的文件都是根目录的;
对照上面插件包的jar,我们看看实际开发中的目录结构:
稍提醒下,如果你的插件中包含servlet,那你需要将它配置在web目录下的WEB-INF/web-custom.xml目录中;这个在以后会经常用到的,比如你提供一个接口给外部程序调用的情况下。目录结构参考:
UserServiceServlet配置在web-custom.xml目录中。
4、编写ant命令,打可部署jar包。如果你不懂ant命令也没关系,你总知道java的基本常用的dos命令。只不过ant就是将dos转换成一个可重复多次调用的命令行。
在工程的根目录中新建一个build目录,新建
build.xml
build.properties文件内容
注意:这里我没有编写编译java代码到class的步骤,我是直接使用MyEclipse自动编译的bin/class的。如果你没有用MyEclipse或Eclipse,那么你需要将src中的Java代码编译class。
这里需要配置tomcat的目录,我这里是5.0.28的版本。我用tomcat6有些问题,这里主要是用tomcat中的lib库,帮助我们编译jsp。还需要配置你当前工程的所在目录,也就是工程在Eclipse中的目录位置。最后你需要配置插件的名称和插件在工程中的所在目录,这个是在打包的时候,需要将其他的html、image、xml等资源导入的jar内。
因为这里的插件是不带jsp的,所以我们执行clean、java-jar、java-plugin-jar。也就是openfire-plugin-java这个命令即可。执行命令后,你可以看到工作空间的工程目录下多了目录和文件。见图:
java-dist目录里面的就是src/plugin/sample目录中的java代码打成的jar包。具体你可以用zip打开看看。
sample就是我们的插件目录,和sample.jar中的内容是一模一样的。
sample.jar就是将sample目录打成jar包。
5、发布插件
发布插件有2种方式
第一种:直接将插件放置在openfire服务器的plugins目录下。我的是在:C:\ProgramFiles\openfire\plugins目录。重起openfire后你可以看到控制台输出我们插件中输出的内容,并且在C:\ProgramFiles\openfire\plugins目录中可以看到该目录下多了一个sample的目录(openfire可以自动解压jar包)。
当你在关闭服务器的瞬间,也会打印销毁插件的消息。
第二种:在openfire启动的情况下,访问
插件按照成功后,访问
至此,不带jsp页面的简单插件就编写部署成功了。
三、开发带jsp、PluginServlet的插件
有些插件是单纯的继承Plugin或Handler什么的,但有些是需要jsp页面和Servlet的。下面我们就来开发带jsp和servlet的插件。在之前的目录下添加文件,目录结构如下:
1、首先建立一个SampleServlet的文件,内容如下