pf4j 例子说明
所属分类 pf4j
浏览量 580
PF4J
Java轻量级插件框架,可实现动态加载,执行,卸载外部插件(支持jar zip)
核心组件
Plugin
所有插件的基类 ,每个插件被加载到一个单独的类加载器中避免冲突
PluginManager
管理插件 加载 启动 停止
内置实现 JarPluginManager, ZipPluginManager, DefaultPluginManager(JarPluginManager+ ZipPluginManager)
AbstractPluginManager( 实现工厂方法) 自定义插件管理器
PluginLoader
ExtensionPoint java接口标记 ,java 接口 或 抽象类 可标记为扩展点(实现ExtensionPoint接口)
Extension java注解 扩展点的实现
plugin-api
定义可扩展接口 ,插件实现 放到一个单独的 plugin-core 模块中,然后打成jar包,放到主程序 plugin-app 的 plugins目录
plugins
插件目录,存放插件的jar包 从该目录加载插件
plugin-app
主程序,依赖 plugin-api ,加载并执行 plugins
自定义扩展接口,继承 ExtensionPoint ,标记为扩展点
public interface Greeting extends ExtensionPoint {
String getGreeting();
}
使用 @Extension注解 自定义类扩展类,实现扩展接口
@Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting() {
return "Welcome";
}
}
如果想控制插件的生命周期,可自定义类 继承 plugin
public class WelcomePlugin extends Plugin {
public WelcomePlugin(PluginWrapper wrapper) {
super(wrapper);
// you can use "wrapper" to have access to the plugin context (plugin manager, descriptor, ...)
}
@Override
public void start() {
System.out.println("WelcomePlugin.start()");
}
@Override
public void stop() {
System.out.println("WelcomePlugin.stop()");
}
@Override
public void delete() {
System.out.println("WelcomePlugin.delete()");
}
}
MANIFEST.MF 插件信息
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: decebal
Build-Jdk: 1.6.0_17
Plugin-Class: org.pf4j.demo.welcome.WelcomePlugin
Plugin-Dependencies: x, y, z
Plugin-Id: welcome-plugin
Plugin-Provider: Decebal Suiu
Plugin-Version: 0.0.1
主程序加载插件
public static void main(String[] args) {
...
// create the plugin manager
// or new ZipPluginManager() / new DefaultPluginManager()
PluginManager pluginManager = new JarPluginManager();
// start and load all plugins of application
pluginManager.loadPlugins();
pluginManager.startPlugins();
// retrieve all extensions for "Greeting" extension point
List greetings = pluginManager.getExtensions(Greeting.class);
for (Greeting greeting : greetings) {
System.out.println(">>> " + greeting.getGreeting());
}
// stop and unload all plugins
pluginManager.stopPlugins();
pluginManager.unloadPlugins();
...
}
上一篇
下一篇
guice根据名字注入消除歧义
scala函数式与非函数式写法比较
scala Int 与 Integer的区别
Maven 打包 定制 manifest
pf4j 实例
Jooq 简介及实例