插件是第三方扩展应用程序功能的一种方式。插件实现由应用程序或其他插件声明的扩展点。此外,插件可以定义扩展点。
注意:从版本 0.9 开始,您可以直接在应用程序 jar 中定义扩展(您没有义务将扩展放入插件中 - 您可以将此扩展视为默认/系统扩展)。有关真实示例,请参阅 WhazzupGreeting。
使用 PF4J,您可以轻松地将单体 Java 应用程序转换为模块化应用程序。
PF4J 是一个开源(Apache 许可证)轻量级(大约100 KB )java 插件框架,具有最小的依赖性(仅 slf4j-api)并且非常可扩展(请参阅PluginDescriptorFinder
和ExtensionFinder
)。
实际上,PF4J 是一个微框架,旨在保持核心简单但可扩展。我们还有一个社区驱动的扩展生态系统。目前可以使用这些扩展:
没有 XML,只有 Java。
您可以将任何接口或抽象类标记为扩展点(使用标记接口ExtensionPoint),并使用@Extension注释指定该类是扩展。
JarPluginManager
、 ZipPluginManager
、 DefaultPluginManager
(它是JarPluginManager
+ ZipPluginManager
),或者您可以从AbstractPluginManager
开始实现自定义插件管理器(仅实现工厂方法)。ExtensionPoint
接口)。PLUGIN =扩展点和扩展+ 生命周期方法(启动、停止、删除)的容器
插件与其他系统中的模块类似。如果您不需要生命周期方法(用于启动、停止、删除的挂钩方法),则不必强制提供插件类(插件描述符中的PluginClass
属性是可选的)。您只需要提供插件的一些描述(id、版本、作者……)即可进行良好的跟踪(您的应用程序想知道谁提供了扩展或扩展点)。
在您的应用程序中添加 pf4j 非常简单。
使用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 {
@ 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()" );
}
}
在上面的代码中,我们创建了一个插件(欢迎),它附带一个Greeting
扩展点扩展。
您可以将插件作为 jar 文件分发(简单的解决方案)。在这种情况下,将插件的元数据添加到 jar 的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
在上面的清单中,我们描述了一个 id 为welcome-plugin
(强制属性)的插件。我们还定义了一个类org.pf4j.demo.welcome.WelcomePlugin
(可选属性),其版本为0.0.1
(强制属性)并依赖于插件x, y, z
(可选属性)。
现在您可以在代码中使用插件和扩展:
public static void main ( String [] args ) {
...
// create the plugin manager
PluginManager pluginManager = new JarPluginManager (); // or "new ZipPluginManager() / new DefaultPluginManager()"
// start and load all plugins of application
pluginManager . loadPlugins ();
pluginManager . startPlugins ();
// retrieve all extensions for "Greeting" extension point
List < Greeting > greetings = pluginManager . getExtensions ( Greeting . class );
for ( Greeting greeting : greetings ) {
System . out . println ( ">>> " + greeting . getGreeting ());
}
// stop and unload all plugins
pluginManager . stopPlugins ();
pluginManager . unloadPlugins ();
...
}
输出是:
>>> Welcome
PF4J 是非常可定制的,并且带有很多好东西。请阅读文档以了解该库的强大功能。
文档可在 pf4j.org 上找到
演示应用程序可在 demo 文件夹中找到