Openfire中插件开发的基本流程

首先说明:目前最新版本的Openfire跟JDK1.8还是不太匹配的,使用JDK1.8来运行Openfire还是会出现一些意想不到的问题,在插件开发的过程中我会说明我遇到的问题。
    Openfire插件的开发其实不难,流程很简单,关键就是插件的功能和业务的设计较难,再有就是既然是Openfire插件,肯定是要对Openfire的某些功能做扩展,在插件中想调用Openfire自身的东西需要详细查看Openfire的文档,在这篇文章中我们不做文档的介绍,知识开发插件的基本流程和步骤的介绍。
        Openfire的插件的开发步骤,首先在Eclipse中导入Openfire源代码,在我的空间里面已有详细过程,然后想开发插件的话,需要在src-->plugins目录中新建自己的插件目录。

Openfire中有些插件是单纯的继承Plugin或Handler什么的,但有些是需要jsp页面和Servlet的。下面我们就先来介绍简单的炖出集成Plugin的插件的开发。

案例插件的功能
      这个插件很简单,就是在openfire Server启动时,和关闭时,在控制台打印出消息。
      3、插件开发的目录结构设计
       先来看一下当前openfire在eclipse中的目录结构:

目录太长,我截取一部分,现在,我们开始写插件。在\openfire_src\src\plugins目录下新建一个helloWorld的文件夹,然后在helloWorld目录下新建一个src的文件夹,放页面和源文件,再新建一个lib目录放第三方的jar包,然后在src文件夹下面新建web,java两个文件夹,web下面放置页面,在这个案例没有用到,可以不建,java文件夹下面放置java源文件,现在目录结构如下:

changelog.html、plugin.xml、readme.html这三个文件分别是你的插件修改日志文件,插件文件和自述文件,其中plugin.xml这个文件很重要,后面我还要解释,先空着,logo_large.gif和logo_small.gif是插件的logo文件,我随便拷了两个。各位,做好上面的步骤以后,注意了,跟openfire自带插件的目录结构不一样,细心的朋友可能注意到了,我新建的src下面有个java目录,而openfire自带插件则没有,而是跑到上面去了,如下:

不要着急,做完这一步,我们的插件就跟openfire自带插件一样了,步骤截图如下:

这时,我们看到,src目录下的java目录不见了,而在上面的源码目录有了我们自己插件了,截图如下:

好了,我们先建一个包,如下:

输入包名:

现在包建好了,我们在这个包中建一个java文件,名为:HelloWorldPlugin,我就不截图,这个学过java的人就应该知道,内容如下:

[java] view plaincopy

  1. package com.helloworld;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.jivesoftware.openfire.XMPPServer;  
  6. import org.jivesoftware.openfire.container.Plugin;  
  7. import org.jivesoftware.openfire.container.PluginManager;  
  8.   
  9. public class HelloWorldPlugin implements Plugin {  
  10.     private XMPPServer server;  
  11.   
  12.     public HelloWorldPlugin() {  
  13.   
  14.     }  
  15.   
  16.     @Override  
  17.     public void initializePlugin(PluginManager manager, File pluginDirectory) {  
  18.         server = XMPPServer.getInstance();  
  19.         System.out.println("HelloWorldPlugin----start");  
  20.         System.out.println(server.getServerInfo());  
  21.     }  
  22.   
  23.     @Override  
  24.     public void destroyPlugin() {  
  25.         System.out.println("HelloWorldPlugin----destroy");  
  26.     }  
  27.   
  28. }  


内容很简单,就是在openfire启动和关闭时,在控制台打印出一条消息。保存好了,我们的java源文件就写好了,现在我们该来写plugin.xml文件了,内容如下:


[html] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <plugin>  
  4.     <class>com.helloworld.HelloWorldPlugin</class>  
  5.     <name>helloWorld</name>  
  6.     <description>First Openfire Custom Plugin.</description>  
  7.     <author>xieyuan</author>  
  8.     <version>1.0.0</version>  
  9.     <date>14/07/2014</date>  
  10.     <minServerVersion>3.9.0</minServerVersion>  
  11.       
  12.     <adminconsole>  
  13.     </adminconsole>  
  14.   
  15. </plugin>  


以及注意上面的class的配置,那个配置是最为重要的,配置的是插件的全路径;name是插件的名称,安装后的插件名称;author是插件作者;adminconsole是配置插件关联的页面的;这里不需要。

       4、编译插件
       展开\openfire_src\build目录,我们发现有一个build.properties.template文件,我们将其重命名为:build.properties,在这个build.properties中加上一行:plugin=helloWorld,截图如下:

使用ant编译插件,截图操作如下:

在弹出的target中选择build one plugin,点击Apply,Run:

之后,我们在控制台上看到:

构建成功,我们在相应的目录下,可以看到,生成的插件包:helloWorld.jar

现在我们来运行我们的插件,看在控制台上能不能打印相应的信息,启动openfire,我们看到在控制台上一句:

好了,大功告成,网上有很多人问,怎么调试插件,这不很简单,直接debug openfire不就行了:


以上就是简单的OpenFire不带JSP和Servlet的插件开发。
下面介绍一下带Servlet和JSP的插件开发;与上面相同的部分会略去。 
在plugins目录下添加文件夹sample(即插件的源代码文件夹),目录结构如下(这个目录结构相信大家都明白了):


1、 首先建立一个SampleServlet的文件,内容如下

  1. package com.hoo.server.plugin;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. /**
  11. * <b>function:</b> sample servlet
  12. * @author hoojo
  13. * @createDate 2014-9-4 下午04:15:20
  14. * @file SampleServlet.java
  15. * @package com.hoo.server.plugin
  16. * @project OpenfirePlugin 
  17. * @version 1.0
  18. */
  19. public class SampleServlet extends HttpServlet {  
  20.       
  21.     private static final long serialVersionUID = -5404916983906926869L;  
  22.   
  23.     @Override
  24.     public void init() throws ServletException {  
  25.         super.init();  
  26.     }  
  27.       
  28.     @Override
  29.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  30.         super.doGet(request, response);  
  31.           
  32.         response.setContentType("text/plain");  
  33.         PrintWriter out = response.getWriter();  
  34.         System.out.println("请求SampleServlet GET Method");  
  35.         out.print("请求SampleServlet GET Method");  
  36.         out.flush();  
  37.     }  
  38.   
  39.     @Override
  40.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  41.         super.doPost(request, response);  
  42.           
  43.         response.setContentType("text/plain");  
  44.         PrintWriter out = response.getWriter();  
  45.         System.out.println("请求SampleServlet GET Method");  
  46.         out.print("请求SampleServlet POST Method");  
  47.         out.flush();  
  48.     }  
  49.   
  50.     @Override
  51.     public void destroy() {  
  52.         super.destroy();  
  53.     }  
  54. }  


2、 在当前插件根目录添加web目录,在目录下建立WEB-INF目录,添加web-custom.xml文件(文件名应该是固定的)。在里面配置我们的servlet。

  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">  
  3. <web-app>  
  4.       
  5.     <servlet>  
  6.         <servlet-class>com.hoo.server.plugin.SampleServlet</servlet-class>  
  7.         <servlet-name>SampleServlet</servlet-name>  
  8.     </servlet>  
  9.       
  10.     <servlet-mapping>  
  11.         <servlet-name>SampleServlet</servlet-name>  
  12.         <url-pattern>/servlet</url-pattern>  
  13.     </servlet-mapping>  
  14. </web-app>  


当插件发布后你可以通过用:http://127.0.0.1:9090/plugins/sample/servlet 就可以访问到这个servlet了。但我发现只需用http://127.0.0.1:9090/plugins/sample也是可以访问到的。好像openfire会自动找到我们插件目录下的servlet配置。
注意:这里的http://127.0.0.1:9090/plugins/是固定的,至少plugins是固定的。所有的插件都在plugins目录下访问的。如果你想知道为什么,你可以看看openfire源码下的web.xml,具体目录路径在/openfire/src/web/WEB-INF/web.xml。里面有一个PluginServlet是过来plugin的配置的。
3、 在web目录下添加jsp文件,文件名是插件名称-自定义名称.jsp(建议规范命名)

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>hello world: 你好openfire</title>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7.     <meta name="pageID" content="sample-service"/>
  8.   </head>
  9.     
  10.   <body>
  11.     <h3>hello world jsp!! <a href="/plugins/sample/servlet">SampleServlet</a></h3>
  12.     <div class="jive-contentBoxHeader">jive-contentBoxHeader</div>
  13.     <div class="jive-contentBox">jive-contentBox</div>
  14.       
  15.     <div class="jive-table">
  16.         <table cellpadding="0" cellspacing="0" border="0" width="100%">
  17.             <thead>
  18.                 <tr>
  19.                     <th>&nbsp;sss</th>
  20.                     <th nowrap>a</th>
  21.                     <th nowrap>b</th>
  22.                 </tr>
  23.             </thead>
  24.             <tbody>
  25.                 <tr>
  26.                     <td align="center">asdf</td>
  27.                     <td align="center">asdf</td>
  28.                     <td align="center">asdf</td>
  29.                 </tr>
  30.                 <tr class="jive-even">
  31.                        <td align="center">asdf</td>
  32.                     <td align="center">asdf</td>
  33.                     <td align="center">asdf</td>
  34.                 </tr>
  35.                 <tr class="jive-odd">
  36.                        <td align="center">asdf</td>
  37.                     <td align="center">asdf</td>
  38.                     <td align="center">asdf</td>
  39.                 </tr>
  40.              </tbody>
  41.         </table>
  42.     </div>
  43.   </body>
  44. </html>


其中最重要的一点就是:<meta name="pageID" content="sample-service"/>这个pageID。这里的是固定的,后面的content对应我们plugin.xml的内容(等下看看plguin.xml的配置)。然后可以适当的看下里面table的 属性和样式,因为很多时候会在jsp中显示内容,且用table布局的。
4、 改下之前的plugin.xml的配置,配置组件在openfire 管理员控制台的哪个地方显示,以及显示的页面。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <plugin>
  3.     <!-- Main plugin class  这里是最重要滴,就是你的插件的全路径-->
  4.     <class>com.hoo.server.plugin.SamplePlugin</class>
  5.   
  6.     <!-- Plugin meta-data -->
  7.     <name>SimplePlugin</name>
  8.     <description>This is the my sample plugin.</description>
  9.     <author>hoojo</author>
  10.   
  11.     <version>1.0</version>
  12.     <date>28/02/2013</date>
  13.     <url>http://localhost:9090/openfire/plugins.jsp</url>
  14.     <minServerVersion>3.4.1</minServerVersion>
  15.     <licenseType>gpl</licenseType>
  16.   
  17.     <adminconsole>      
  18.         <tab id="tab-server">
  19.             <sidebar id="sidebar-server-settings">
  20.                 <item id="sample-service" name="Sample Service" url="sample-service.jsp"
  21.                      description="Click is trigger sample plugin" />
  22.             </sidebar>
  23.         </tab>
  24.     </adminconsole>
  25. </plugin>


这里主要就是adminconsole这里面的配置。首先tab-server应该是在管理员控制台页面的服务器菜单中显示;sidebar中的的id配置固定这样写即可;item中的id(sample-service)对应的就是上面的sample-service.jsp的<meta name="pageID" content="sample-service"/>的content内容;item的url对应的是我们写的jsp页面;name是插件的菜单名称。也就是说在管理员控制台页面中的服务器菜单下增加一个sample service的菜单,打开的页面是sample-service.jsp页面。
5、 运行ant脚本,打包发布插件。在上一章节有完整ant脚本的,运行build.xml中的这个openfire-plugins命令即可打包。然后将打好包的sample.jar发布到openfire的plugins目录下即可。
打包后的jar插件目录结构如下:

 

 


启动openfire后,在openfire管理员控制台页面的服务器->服务器设置中就可以看到Sample Service插件了。

 

 


点击Sample Servlet就可以看到openfire控制台打印请求的文字信息。
我在实现插件的过程中,有一些包名写错了,按道理说在加载插件时OpenFire会在控制台提示错误信息(因为我的Openfire种添加了DEBUG插件),但我本地一点错误信息也没有,但Openfire管理平台上就是没有加载上插件,无奈之举,把编译好的插件jar包发给同事,在同事那发现了错误,最后才确定了原来是我本地JDK版本用的1.8,DEBUG插件根本不兼容,改成JDK1.6没有问题了,问题也找到了,改正后一切如上所述。所以程序员们大家在开发过程中对于新版本的工具要慎重使用啊。谢谢!

转自孟老师的QQ空间。

 

posted on 2014-09-05 16:51  AndroidSolo  阅读(334)  评论(0)    收藏  举报

导航