プラグインは、サードパーティがアプリケーションの機能を拡張する方法です。プラグインは、アプリケーションまたは他のプラグインによって宣言された拡張ポイントを実装します。また、プラグインは拡張ポイントを定義できます。
注:バージョン 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 =拡張ポイントおよび拡張機能のコンテナ + ライフサイクル メソッド (開始、停止、削除)
PLUGIN は、他のシステムのMODULEと似ています。ライフサイクル メソッド (開始、停止、削除のフック メソッド) が必要ない場合は、プラグイン クラスを指定する必要はありません (プラグイン記述子の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
拡張ポイントの 1 つの拡張機能が付属するプラグイン (ようこそ) を作成しました。
プラグインを 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
上記のマニフェストでは、 welcome-plugin
(必須属性) の ID を持つプラグインを記述しました。また、バージョン0.0.1
(必須属性) とプラグインx, y, z
(オプション属性) への依存関係を持つクラスorg.pf4j.demo.welcome.WelcomePlugin
(オプション属性) も定義しました。
これで、コード内でプラグインと拡張機能を使用できるようになりました。
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 で入手できます。
デモ アプリケーションはデモ フォルダーにあります