Java轻量级的插件框架PF4J的使用教程
一、简介
PF4J是一个Java轻量级的插件框架,可以实现动态加载,执行,卸载外部插件(支持jar
以及zip
),具体可以看官网:https://pf4j.org/。
本文例子基于Github地址:https://github.com/pf4j/pf4j
<dependency><groupId>org.pf4j</groupId><artifactId>pf4j</artifactId><version>3.0.1</version>
</dependency>
二、示例
插件项目会涉及到3个工程:
- plugin-api:定义可扩展接口
- plugins:插件项目,可以包含多个插件,需要实现
plugin-api
中定义的接口 - plugin-app:主程序,需要依赖
plugin-api
,加载并执行plugins
1、定义可扩展接口(plugin-api)
简单定义一个接口,需继承ExtensionPoint
:
package plugin.api;import org.pf4j.ExtensionPoint;public interface Greeting extends ExtensionPoint {String getGreeting();
}
2、实现插件(plugins)
插件需要实现plugin-api
定义的接口,并且使用@Extension
标记:
package plugins;import org.pf4j.Extension;
import plugin.api.Greeting;@Extension
public class WelcomeGreeting implements Greeting {public String getGreeting() {return "Welcome";}
}
3、插件打包(plugins)
插件打包时,需要往MANIFEST.MF
写入插件信息,此处使用maven
插件(打包命令为package
):
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.3.1</version><configuration><archive><manifestEntries><Plugin-Id>welcome-plugin</Plugin-Id><Plugin-Version>0.0.1</Plugin-Version></manifestEntries></archive></configuration>
</plugin>
根据Github上介绍,MANIFEST.MF
中Plugin-Id
以及Plugin-Version
是必须信息:
In above manifest I described a plugin with id
welcome-plugin
(mandatory attribute), with classorg.pf4j.demo.welcome.WelcomePlugin
(optional attribute), with version0.0.1
(mandatory attribute) and with dependencies to pluginsx, y, z
(optional attribute).
此处定义插件ID为welcome-plugin
,版本为0.0.1
4、加载执行插件(plugin-app)
package plugin.app;import java.nio.file.Paths;
import java.util.List;import org.pf4j.JarPluginManager;
import org.pf4j.PluginManager;import plugin.api.Greeting;public class Main {public static void main(String[] args) {// jar插件管理器PluginManager pluginManager = new JarPluginManager();// 加载指定路径插件pluginManager.loadPlugin(Paths.get("plugins-0.0.1-SNAPSHOT.jar"));// 启动指定插件(也可以加载所有插件)pluginManager.startPlugin("welcome-plugin");// 执行插件List<Greeting> greetings = pluginManager.getExtensions(Greeting.class);for (Greeting greeting : greetings) {System.out.println(">>> " + greeting.getGreeting());}// 停止并卸载指定插件pluginManager.stopPlugin("welcome-plugin");pluginManager.unloadPlugin("welcome-plugin");}
}
运行输出:
>>> Welcome
5、其他
(1)插件周期
如果对插件生命周期(如加载,执行,停止等)有兴趣的话,可以实现插件类继承Plugin
:
package plugins;import org.pf4j.Plugin;
import org.pf4j.PluginWrapper;public class WelcomePlugin extends Plugin {public WelcomePlugin(PluginWrapper wrapper) {super(wrapper);}@Overridepublic void start() {System.out.println("WelcomePlugin.start()");}@Overridepublic void stop() {System.out.println("WelcomePlugin.stop()");}@Overridepublic void delete() {System.out.println("WelcomePlugin.delete()");}
}
同时往MANIFEST.MF
写入插件信息:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.3.1</version><configuration><archive><manifestEntries><Plugin-Id>welcome-plugin</Plugin-Id><Plugin-Version>0.0.1</Plugin-Version><!-- 新增 --><Plugin-Class>plugins.WelcomePlugin</Plugin-Class></manifestEntries></archive></configuration>
</plugin>
打包后运行输出:
WelcomePlugin.start() >>> Welcome WelcomePlugin.stop()
(2)如果对运行流程感兴趣,或者调试,可以将日志级别设为debug
日志
log4j.properties
示例:
log4j.rootLogger = debug,stdout,loglog4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %r ms: %m%nlog4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.DatePattern = _yyyy-MM-dd
log4j.appender.log.File = logs/debug.log
log4j.appender.log.Encoding = UTF-8
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n
Java轻量级的插件框架PF4J的使用教程相关推荐
- Java 的插件框架 PF4J
开源项目地址:https://github.com/decebals/pf4j PF4J 是一个 Java 的插件框架,为第三方提供应用扩展的渠道.使用 PF4J 你可以轻松将一个普通的 Java 应 ...
- Java轻量级业务层框架Spring两大核心IOC和AOP原理
IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...
- java 日志 生成器_自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程
项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java ...
- P3-weixin-2.0.1 版本发布,JAVA微信插件框架
P3-weixin-2.0.1版本发布(JAVA微信插件框架) P3-Weixin是轻量级Java插件开发框架,采用主流JAVA技术,集成强大代码生成器,增删改查一键生成,封装统一后台管理系统,不仅适 ...
- jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...
1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...
- Java 轻量级框架Spring曝出0day漏洞
首语 3月29日,Spring框架曝出RCE 0day漏洞.已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使 ...
- 10分钟带你了解轻量级插件框架x3py
写在前面 由于本人目前主要从事的是Windows客户端开发方面的工作,所以本文介绍x3py的侧重点也是从客户端程序开发者方面叙述的.本文主要参考整理自x3py的官方Wiki,修正了一些官方示例中的错误 ...
- Java Plugin Framework (JPF) java插件框架学习
2019独角兽企业重金招聘Python工程师标准>>> JPF (Java Plugin Framework) 是一个插件框架,类似Eclipse的插件系统,不过这个的依赖关系是使用 ...
- [热拔插] 轻量级Winform插件式框架
写在前面的话 对于大神,Winform这种"古董玩具",实在没太多"技术性"可言了,然而『好用才是王道』,本文不以技术为卖点,纯属经验之谈,欢迎交流拍砖 朴素版 ...
最新文章
- 深度学习有哪些经典数据集?
- docker linux redis 安装
- 【整理】SAP货币汇率转换
- HDU 5624 KK's Reconstruction
- 计算机应用基础本科常见问题讨论,《计算机应用基础》(本科)2017年6月期末考试指导.pdf...
- 【DotNetMLLearn】.NET Core 人工智能系列-.NET Interactive环境介绍
- 维护旧项目_为什么您的旧版软件难以维护-以及如何处理。
- php 判斷數據庫表是否存在,phpl判斷mysq數據庫中的某個數據表是否存在的方法總結...
- wordpress 资料管理系统_说一说库存管理系统。
- FFMPEG 的学习
- 【Mybatis系列】从源码角度理解Mybatis字段映射-驼峰式命名
- 系统编程__2__父子进程的创建和回收
- 惠康游戏手柄 WE-8400 Windows 10 驱动教程
- PMP 管理学6大定律之四(光环效应)
- Mysql,Oracle varchar2 字节长度
- 盲盒识别装置-2022TI杯10月联赛D题
- 一带一路”建设的助力者——刘岳霖
- crypto405-grasshopper(网鼎杯2022)
- 重新思考:在ResNet与Transformer均适用的跳跃连接
- System.Web.Caching.Cache
热门文章
- 怎么实现从抖音内跳转到微信关注页面?
- 如何使用 WEB 技术编写前端代码,实现大屏展示和地图显示功能
- ioctl(sock, SIOCGIFHWADDR, ifr)获取网卡mac地址
- gpd linux内核,linux内核驱动ZLG7290芯片
- mc是电子计算机的什么键,计算机上的mc是什么键
- VIP之Clipper
- 在linux中配置编译u-boot方法,在ZC702上运行Linux(4)-编译和使用U-Boot Linux
- Python·.·.print()函数格式化输出-超详解
- while循环,do while循环 break-continu-label
- JavaScript赋值运算符,比较运算符,逻辑运算符