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!"); } }}
- pf4j 插件使用
- Java 的插件框架 PF4J
- Java 的插件框架 PF4J
- Java 的插件框架 PF4J
- ajaxFileUpload插件的使用 ------------------插件
- 【Unity插件】FingerGestures 插件使用
- unity插件使用--Unitybmob插件使用记录
- jigloo插件的使用
- File_column插件使用经验
- googlipse插件使用
- Grails使用FCKedtior插件
- firebox插件使用笔记
- Eclipse 插件使用
- jQuery tablesorter 插件使用
- Properties_Editor插件的使用
- Eclipse打包插件使用
- jquery.quickpaginate插件使用
- Tab插件使用
- 项目准备工作与环境搭建
- 国际游学意义大 美国游学学生:站的更高才能看的越远
- js刷新页面大全
- 图片上传
- PHP 操作redis 详细讲解
- pf4j 插件使用
- js获取Url中的工程路径名
- entity framework 批量操作
- Jenkins用户手册-安装
- HTML <object> 标签
- 【洛谷2458】【SDOI2006】保安站岗(树形DP)
- 卷积神经网络
- 动态规划(1)
- 前端面试相关