Plugin adalah cara bagi pihak ketiga untuk memperluas fungsionalitas suatu aplikasi. Sebuah plugin mengimplementasikan titik ekstensi yang dideklarasikan oleh aplikasi atau plugin lainnya. Selain itu, sebuah plugin dapat menentukan titik ekstensi.
CATATAN: Mulai versi 0.9 Anda dapat menentukan ekstensi langsung di jar aplikasi (Anda tidak wajib memasukkan ekstensi ke dalam plugin - Anda dapat melihat ekstensi ini sebagai ekstensi default/sistem). Lihat WhazzupGreeting untuk contoh nyata.
Dengan PF4J Anda dapat dengan mudah mengubah aplikasi java monolitik menjadi aplikasi modular.
PF4J adalah kerangka plugin open source (lisensi Apache) ringan (sekitar 100 KB ) untuk java, dengan ketergantungan minimal (hanya slf4j-api) dan sangat dapat diperluas (lihat PluginDescriptorFinder
dan ExtensionFinder
).
Praktisnya, PF4J adalah kerangka mikro yang bertujuan untuk menjaga inti tetap sederhana namun dapat diperluas. Kami juga memiliki ekosistem ekstensi berbasis komunitas. Untuk saat ini tersedia ekstensi berikut:
Tidak ada XML, hanya Java.
Anda dapat menandai antarmuka atau kelas abstrak apa pun sebagai titik ekstensi (dengan antarmuka penanda ExtensionPoint) dan Anda menentukan bahwa suatu kelas adalah ekstensi dengan anotasi @Extension.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
(ini adalah JarPluginManager
+ ZipPluginManager
) atau Anda dapat mengimplementasikan pengelola plugin khusus mulai dari AbstractPluginManager
(hanya mengimplementasikan metode pabrik).ExtensionPoint
).PLUGIN = wadah untuk EXTENSION POINTS dan EXTENSIONS + metode siklus hidup (mulai, hentikan, hapus)
PLUGIN mirip dengan MODUL dari sistem lain. Jika Anda tidak memerlukan metode siklus hidup (metode kait untuk memulai, menghentikan, menghapus), Anda tidak dipaksa untuk menyediakan kelas plugin (properti PluginClass
dari deskriptor plugin bersifat opsional). Anda hanya perlu memberikan beberapa deskripsi plugin (id, versi, pembuat, ...) untuk pelacakan yang baik (aplikasi Anda ingin mengetahui siapa yang menyediakan ekstensi atau poin ekstensi).
Sangat mudah untuk menambahkan pf4j di aplikasi Anda.
Tentukan titik ekstensi di aplikasi/plugin Anda menggunakan penanda antarmuka ExtensionPoint :
public interface Greeting extends ExtensionPoint {
String getGreeting ();
}
Buat ekstensi menggunakan anotasi @Extension
:
@ Extension
public class WelcomeGreeting implements Greeting {
public String getGreeting () {
return "Welcome" ;
}
}
Buat ( opsional ) kelas Plugin
jika Anda tertarik dengan peristiwa siklus hidup plugin (mulai, hentikan, ...):
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()" );
}
}
Dalam kode di atas kami telah membuat sebuah plugin (selamat datang) yang dilengkapi dengan satu ekstensi untuk titik ekstensi Greeting
.
Anda dapat mendistribusikan plugin Anda sebagai file jar (solusi sederhana). Dalam hal ini tambahkan metadata plugin di file 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
Dalam manifes di atas, kami telah menjelaskan sebuah plugin dengan id welcome-plugin
(atribut wajib). Kami juga telah mendefinisikan kelas org.pf4j.demo.welcome.WelcomePlugin
(atribut opsional), dengan versi 0.0.1
(atribut wajib) dan dengan ketergantungan pada plugin x, y, z
(atribut opsional).
Sekarang Anda dapat bermain-main dengan plugin dan ekstensi di kode Anda:
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 ();
...
}
Outputnya adalah:
>>> Welcome
PF4J sangat dapat dikustomisasi dan hadir dengan banyak fitur. Silakan baca dokumentasi untuk menemukan sendiri kehebatan perpustakaan ini.
Dokumentasi tersedia di pf4j.org
Aplikasi demo tersedia di folder demo