pf4j 插件使用

来源:互联网 发布:淘宝卖家升级好难 编辑:程序博客网 时间:2024/05/22 13:43

最近想写个基于插件式的程序,从网上找了一个,叫pf4j,这个东西的实现思想是主程序中有个接口,插件中实现这个接口,以jar包或者zip包的形式放进来,然后主程序就有插件的功能了。但是百度了一圈基本都是下面这张图,这又个吊用。这样地描述谁不会写,关键是这插件怎么来用却以...来代替了。那我就写个这几天是怎么从这个坑里爬出来的。


1、首先下载一下所需的jar包,由于不是在互联网环境中使用,所以不能用maven,于是手动找的jar包,共需要以下几个包,在网上很好找,pf4j-*.jar 在maven reposity 中能下载,若想用最新的且条件允许可以自己从github上下载源码后用maven编译

2、整个实现过程总共涉及三个程序,第一个就是运行插件的程序,第二个是插件,第三个是接口程序。没错,建了三个java project,其中的坑下面说。

第一、接口程序

没啥可说地就一接口,但是要继承 ro.fortsoft.pf4j.ExtensionPoint 这个类


第二、插件程序

此处遇到的多个坑,1,上一步中地接口程序必须打成jar包,放在插件程序中build path,我曾经把它放在com.imw.service.impl中,但就是运行地时候不行,这个坑试了一天才爬出来。2,META-INF这个文件夹中有两个文件,如果时maven环境下编译,这俩会自动生成,但坑就坑在我这网络不能上互联网,所以必须手动写。extension.ids文件中就一行,但是必须以此格式来写com.imw.service.impl.ModelInterFaceImpl$ModelInterFaceImpls 即插件中必须以内部类地方式来实现接口。MANIFEST.MF中必填的就Plugin-Class这个,它应该写$前面的部分,即com.imw.service.impl.ModelInterFaceImpl,其他随便填写,但是若有多个插件同时存在时Plugin-Id 不能重复。下面是程序结构图和详细的代码实现。3、那个内部的实现类必须时静态的,掉了static 会报classnotFoundException  说什么com.imw.service.impl.ModelInterFaceImpl$ModelInterFaceImpls.init<>() 找不到



打好的插件jar包如图

META-INF文件夹中


3、运行插件的程序

1、需要把第一步中的接口打成jar包放到build path下 

2、建一个plugins文件夹,插件就放在这里面

3、最好把log4j.properties放进去,刚开始时我没把它放进来,调试地时候不好调试

4、 代码样例中有下面这两个方法,分别是用于ZIP类型地插件和Jar类型的插件。这也是一个坑,当时从github上弄下来时,JarPluginManager 是注释掉的,当时寻思先用zip这个试试,可zip包中必须在最顶层有个class文件夹,如下面摘的图所示,着实坑了一把。jar类型的插件用eclipse打出来放进去就能用了

 final PluginManager pluginManager = new DefaultPluginManager();
final PluginManager pluginManager = new JarPluginManager();

(此图摘自http://www.cnblogs.com/sper/p/5716819.html 昵称:★苏鹏)
echo +      |     -- classes +     |          |     |          -- META-INF +     |          |           |     |          |           --extensions.idx     |          |           |     |          |           --MANIFEST.MF     |          -- (编译后的插件代码)     -- lib +            |            -- (插件依赖的第三方jar 

以下是运行成功地截图,共两个插件,实现了同一个接口。









现整个过程需要三个部分,第一就是根接口,第二是插件,第三是应用程序。这是3个java项目。

首先要下载jar包,百度搜索maven repository,然后搜索pf4j,如下图,下载第一个的相应版本就可以,我用的是1.2

 

然后,创建根节点项目,

复制代码
package com.wgn.test1;import ro.fortsoft.pf4j.ExtensionPoint;/* * 根接口,继承ExtensionPoint * 将该项目打成jar包,放到plugin项目的lib文件夹下,然后构建配置路径 */public interface Testpf4j extends ExtensionPoint {    public void hello();}
复制代码

第三,创建插件项目,并将根接口项目打成jar包,放到插件项目的lib目录下,构建路径

复制代码
package com.wgn.test2;import com.wgn.test1.Testpf4j;import ro.fortsoft.pf4j.Extension;import ro.fortsoft.pf4j.Plugin;import ro.fortsoft.pf4j.PluginWrapper;public class Testpf4jImpl extends Plugin {    public Testpf4jImpl(PluginWrapper wrapper) {        super(wrapper);    }    @Override    public void start() {        System.out.println("----------------------start");    }        @Override    public void stop() {        System.out.println("----------------------stop");    }        /*     * 必须添加static修饰符     */    @Extension    public static class Testpf4jImpls implements Testpf4j {        @Override        public void hello() {            System.out.println("hello world!");        }            }}
复制代码

 

MANIFEST.MF:

复制代码
Manifest-Version: 1.0Plugin_Dependencies: Implementation-Title: Demo Plugin #2Implementation-Version: 1.2.0Archiver-Version: Plexus ArchiverBuilt-By: rootSpecification_Title: Demo Plugin #2Implementation-Vendor-Id: com.wgn.test1.Testpf4jPlugin-Version: 0.0.1Plugin-Id: plugin01Plugin-Provider: Decebal SuiuPlugin-Class: com.wgn.test2.TestPf4jImplBuild-dk: 1.8.0_102Specification-Version; 1.2.0
复制代码

extensions.idx:

com.wgn.test2.Testpf4jImpl$Testpf4jImpls

 

 

 

最后,新建程序项目,将插件放入plugins目录下,根接口放入lib目录下

复制代码
package com.wgn.test2;import com.wgn.test1.Testpf4j;import ro.fortsoft.pf4j.Extension;import ro.fortsoft.pf4j.Plugin;import ro.fortsoft.pf4j.PluginWrapper;public class Testpf4jImpl extends Plugin {    public Testpf4jImpl(PluginWrapper wrapper) {        super(wrapper);    }    @Override    public void start() {        System.out.println("----------------------start");    }        @Override    public void stop() {        System.out.println("----------------------stop");    }        /*     * 必须添加static修饰符     */    @Extension    public static class Testpf4jImpls implements Testpf4j {        @Override        public void hello() {            System.out.println("hello world!");        }            }}
复制代码


原创粉丝点击