PF4J是一个Java轻量级的插件框架,可以实现动态加载,执行,卸载外部插件(支持jar
以及zip
),具体可以看官网介绍。
本文例子基于Github地址:https://github.com/pf4j/pf4j
1 | <dependency> |
工程结构
插件项目会涉及到3个工程:
- plugin-api:定义可扩展接口
- plugins:插件项目,可以包含多个插件,需要实现
plugin-api
中定义的接口 - plugin-app:主程序,需要依赖
plugin-api
,加载并执行plugins
定义可扩展接口(plugin-api)
简单定义一个接口,需继承ExtensionPoint
:
1 | package plugin.api; |
实现插件(plugins)
插件需要实现plugin-api
定义的接口,并且使用@Extension
标记:
1 | package plugins; |
插件打包(plugins)
插件打包时,需要往MANIFEST.MF
写入插件信息,此处使用maven
插件(打包命令为package
):
1 | <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
加载执行插件(plugin-app)
1 | package plugin.app; |
运行输出:
1 | >>> Welcome |
其他
插件周期
如果对插件生命周期(如加载,执行,停止等)有兴趣的话,可以实现插件类继承Plugin
:
1 | package plugins; |
同时往MANIFEST.MF
写入插件信息:
1 | <plugin> |
打包后运行输出:
1 | WelcomePlugin.start() |
日志
如果对运行流程感兴趣,或者调试,可以将日志级别设为debug
log4j.properties
示例:
1 | log4j.rootLogger = debug,stdout,log |