插件是第三方擴展應用程式功能的一種方式。插件實作由應用程式或其他外掛程式聲明的擴充點。此外,插件可以定義擴充點。
注意:從版本 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 資料夾中找到