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
- package com.helloworld;
- import java.io.File;
- import org.jivesoftware.openfire.XMPPServer;
- import org.jivesoftware.openfire.container.Plugin;
- import org.jivesoftware.openfire.container.PluginManager;
- public class HelloWorldPlugin implements Plugin {
- private XMPPServer server;
- public HelloWorldPlugin() {
- }
- @Override
- public void initializePlugin(PluginManager manager, File pluginDirectory) {
- server = XMPPServer.getInstance();
- System.out.println("HelloWorldPlugin----start");
- System.out.println(server.getServerInfo());
- }
- @Override
- public void destroyPlugin() {
- System.out.println("HelloWorldPlugin----destroy");
- }
- }
内容很简单,就是在openfire启动和关闭时,在控制台打印出一条消息。保存好了,我们的java源文件就写好了,现在我们该来写plugin.xml文件了,内容如下:
[html] view plaincopy
- <?xml version="1.0" encoding="UTF-8"?>
- <plugin>
- <class>com.helloworld.HelloWorldPlugin</class>
- <name>helloWorld</name>
- <description>First Openfire Custom Plugin.</description>
- <author>xieyuan</author>
- <version>1.0.0</version>
- <date>14/07/2014</date>
- <minServerVersion>3.9.0</minServerVersion>
- <adminconsole>
- </adminconsole>
- </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的文件,内容如下
- package com.hoo.server.plugin;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * <b>function:</b> sample servlet
- * @author hoojo
- * @createDate 2014-9-4 下午04:15:20
- * @file SampleServlet.java
- * @package com.hoo.server.plugin
- * @project OpenfirePlugin
- * @version 1.0
- */
- public class SampleServlet extends HttpServlet {
- private static final long serialVersionUID = -5404916983906926869L;
- @Override
- public void init() throws ServletException {
- super.init();
- }
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- super.doGet(request, response);
- response.setContentType("text/plain");
- PrintWriter out = response.getWriter();
- System.out.println("请求SampleServlet GET Method");
- out.print("请求SampleServlet GET Method");
- out.flush();
- }
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- super.doPost(request, response);
- response.setContentType("text/plain");
- PrintWriter out = response.getWriter();
- System.out.println("请求SampleServlet GET Method");
- out.print("请求SampleServlet POST Method");
- out.flush();
- }
- @Override
- public void destroy() {
- super.destroy();
- }
- }
2、 在当前插件根目录添加web目录,在目录下建立WEB-INF目录,添加web-custom.xml文件(文件名应该是固定的)。在里面配置我们的servlet。
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
- <web-app>
- <servlet>
- <servlet-class>com.hoo.server.plugin.SampleServlet</servlet-class>
- <servlet-name>SampleServlet</servlet-name>
- </servlet>
- <servlet-mapping>
- <servlet-name>SampleServlet</servlet-name>
- <url-pattern>/servlet</url-pattern>
- </servlet-mapping>
- </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(建议规范命名)
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>hello world: 你好openfire</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="pageID" content="sample-service"/>
- </head>
- <body>
- <h3>hello world jsp!! <a href="/plugins/sample/servlet">SampleServlet</a></h3>
- <div class="jive-contentBoxHeader">jive-contentBoxHeader</div>
- <div class="jive-contentBox">jive-contentBox</div>
- <div class="jive-table">
- <table cellpadding="0" cellspacing="0" border="0" width="100%">
- <thead>
- <tr>
- <th> sss</th>
- <th nowrap>a</th>
- <th nowrap>b</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- </tr>
- <tr class="jive-even">
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- </tr>
- <tr class="jive-odd">
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- <td align="center">asdf</td>
- </tr>
- </tbody>
- </table>
- </div>
- </body>
- </html>
其中最重要的一点就是:<meta name="pageID" content="sample-service"/>这个pageID。这里的是固定的,后面的content对应我们plugin.xml的内容(等下看看plguin.xml的配置)。然后可以适当的看下里面table的 属性和样式,因为很多时候会在jsp中显示内容,且用table布局的。
4、 改下之前的plugin.xml的配置,配置组件在openfire 管理员控制台的哪个地方显示,以及显示的页面。
- <?xml version="1.0" encoding="UTF-8"?>
- <plugin>
- <!-- Main plugin class 这里是最重要滴,就是你的插件的全路径-->
- <class>com.hoo.server.plugin.SamplePlugin</class>
- <!-- Plugin meta-data -->
- <name>SimplePlugin</name>
- <description>This is the my sample plugin.</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>
- <tab id="tab-server">
- <sidebar id="sidebar-server-settings">
- <item id="sample-service" name="Sample Service" url="sample-service.jsp"
- description="Click is trigger sample plugin" />
- </sidebar>
- </tab>
- </adminconsole>
- </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) 收藏 举报



浙公网安备 33010602011771号