一、简介

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.MFPlugin-Id以及Plugin-Version是必须信息:

In above manifest I described a plugin with id welcome-plugin (mandatory attribute), with class org.pf4j.demo.welcome.WelcomePlugin (optional attribute), with version 0.0.1 (mandatory attribute) and with dependencies to plugins x, 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的使用教程相关推荐

  1. Java 的插件框架 PF4J

    开源项目地址:https://github.com/decebals/pf4j PF4J 是一个 Java 的插件框架,为第三方提供应用扩展的渠道.使用 PF4J 你可以轻松将一个普通的 Java 应 ...

  2. Java轻量级业务层框架Spring两大核心IOC和AOP原理

    IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...

  3. java 日志 生成器_自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程

    项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java ...

  4. P3-weixin-2.0.1 版本发布,JAVA微信插件框架

    P3-weixin-2.0.1版本发布(JAVA微信插件框架) P3-Weixin是轻量级Java插件开发框架,采用主流JAVA技术,集成强大代码生成器,增删改查一键生成,封装统一后台管理系统,不仅适 ...

  5. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

  6. Java 轻量级框架Spring曝出0day漏洞

    首语 3月29日,Spring框架曝出RCE 0day漏洞.已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使 ...

  7. 10分钟带你了解轻量级插件框架x3py

    写在前面 由于本人目前主要从事的是Windows客户端开发方面的工作,所以本文介绍x3py的侧重点也是从客户端程序开发者方面叙述的.本文主要参考整理自x3py的官方Wiki,修正了一些官方示例中的错误 ...

  8. Java Plugin Framework (JPF) java插件框架学习

    2019独角兽企业重金招聘Python工程师标准>>> JPF (Java Plugin Framework) 是一个插件框架,类似Eclipse的插件系统,不过这个的依赖关系是使用 ...

  9. [热拔插] 轻量级Winform插件式框架

    写在前面的话 对于大神,Winform这种"古董玩具",实在没太多"技术性"可言了,然而『好用才是王道』,本文不以技术为卖点,纯属经验之谈,欢迎交流拍砖 朴素版 ...

最新文章

  1. 深度学习有哪些经典数据集?
  2. docker linux redis 安装
  3. 【整理】SAP货币汇率转换
  4. HDU 5624 KK's Reconstruction
  5. 计算机应用基础本科常见问题讨论,《计算机应用基础》(本科)2017年6月期末考试指导.pdf...
  6. 【DotNetMLLearn】.NET Core 人工智能系列-.NET Interactive环境介绍
  7. 维护旧项目_为什么您的旧版软件难以维护-以及如何处理。
  8. php 判斷數據庫表是否存在,phpl判斷mysq數據庫中的某個數據表是否存在的方法總結...
  9. wordpress 资料管理系统_说一说库存管理系统。
  10. FFMPEG 的学习
  11. 【Mybatis系列】从源码角度理解Mybatis字段映射-驼峰式命名
  12. 系统编程__2__父子进程的创建和回收
  13. 惠康游戏手柄 WE-8400 Windows 10 驱动教程
  14. PMP 管理学6大定律之四(光环效应)
  15. Mysql,Oracle varchar2 字节长度
  16. 盲盒识别装置-2022TI杯10月联赛D题
  17. 一带一路”建设的助力者——刘岳霖
  18. crypto405-grasshopper(网鼎杯2022)
  19. 重新思考:在ResNet与Transformer均适用的跳跃连接
  20. System.Web.Caching.Cache

热门文章

  1. 怎么实现从抖音内跳转到微信关注页面?
  2. 如何使用 WEB 技术编写前端代码,实现大屏展示和地图显示功能
  3. ioctl(sock, SIOCGIFHWADDR, ifr)获取网卡mac地址
  4. gpd linux内核,linux内核驱动ZLG7290芯片
  5. mc是电子计算机的什么键,计算机上的mc是什么键
  6. VIP之Clipper
  7. 在linux中配置编译u-boot方法,在ZC702上运行Linux(4)-编译和使用U-Boot Linux
  8. Python·.·.print()函数格式化输出-超详解
  9. while循环,do while循环 break-continu-label
  10. JavaScript赋值运算符,比较运算符,逻辑运算符