플러그인은 제3자가 애플리케이션의 기능을 확장하는 방법입니다. 플러그인은 애플리케이션이나 다른 플러그인에서 선언한 확장 지점을 구현합니다. 또한 플러그인은 확장 지점을 정의할 수 있습니다.
참고: 버전 0.9부터 애플리케이션 jar에서 직접 확장을 정의할 수 있습니다(확장을 플러그인에 넣을 의무는 없습니다. 이 확장은 기본/시스템 확장으로 볼 수 있습니다). 실제 예는 WhazupGreeting을 참조하세요.
PF4J를 사용하면 모놀리식 Java 애플리케이션을 모듈식 애플리케이션으로 쉽게 변환할 수 있습니다.
PF4J는 Java용 오픈 소스(Apache 라이센스) 경량(약 100KB ) 플러그인 프레임워크로, 종속성이 최소화되고(slf4j-api만) 확장성이 뛰어납니다( PluginDescriptorFinder
및 ExtensionFinder
참조).
실제로 PF4J는 핵심을 단순하면서도 확장 가능하게 유지하는 것을 목표로 하는 마이크로 프레임워크입니다. 우리는 또한 커뮤니티 중심의 확장 생태계를 갖추고 있습니다. 현재 다음 확장을 사용할 수 있습니다.
XML은 없고 Java만 있습니다.
모든 인터페이스 또는 추상 클래스를 확장 지점(마커 인터페이스 ExtensionPoint 사용)으로 표시할 수 있으며 @Extension 주석을 사용하여 클래스가 확장임을 지정했습니다.
JarPluginManager
, ZipPluginManager
, DefaultPluginManager
( JarPluginManager
+ ZipPluginManager
)와 같은 내장 구현을 사용하거나 AbstractPluginManager
(팩토리 메소드만 구현)에서 시작하는 사용자 정의 플러그인 관리자를 구현할 수 있습니다.ExtensionPoint
인터페이스 구현).PLUGIN = EXTENSION POINTS 및 EXTENSIONS + 수명 주기 방법(시작, 중지, 삭제)을 위한 컨테이너
플러그인 은 다른 시스템의 모듈 과 유사합니다. 수명 주기 메서드(시작, 중지, 삭제를 위한 후크 메서드)가 필요하지 않은 경우 플러그인 클래스를 제공할 필요가 없습니다(플러그인 설명자의 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
(필수 속성)인 플러그인을 설명했습니다. 또한 버전 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에서 볼 수 있습니다.
데모 애플리케이션은 데모 폴더에서 사용할 수 있습니다.