--- /dev/null
+# PF4J Gradle Demo
+
+This demo assumes that you know the basics of Gradle (Please look at [gradle](https://gradle.org/) for more info)
+
+### Setup/Build
+
+1. Clone the repo
+2. Go to demo_gradle `cd demo_gradle`
+3. run `gradle build`
+
+* This will produce one jar, named app-plugin-demo-uberjar.jar, located in the `app/build/libs/` directory and three plugins zips located in `build/plugins` directory.
+* The plugins are `plugin-hello-plugin-0.0.1.zip`, `plugin-KotlinPlugin-1.0.0.zip` and `plugin-welcome-plugin-0.0.1.zip`
+
+### Run the demo
+
+1. Run
+
+```
+ java -jar -Dpf4j.pluginsDir=build/plugins app/build/libs/app-plugin-demo-uberjar.jar
+```
+
+* pf4j.pluginsDir: is where the plugins are located
+
+2. The demo's output should look similar to: (Please see `Boot#main()` for more details)
+```
+demo_gradle $ java -jar -Dpf4j.pluginsDir=build/plugins app/build/libs/app-plugin-demo-uberjar.jar
+[main] INFO org.pf4j.demo.Boot - ########################################
+[main] INFO org.pf4j.demo.Boot - PF4J-DEMO
+[main] INFO org.pf4j.demo.Boot - ########################################
+[main] INFO org.pf4j.DefaultPluginStatusProvider - Enabled plugins: []
+[main] INFO org.pf4j.DefaultPluginStatusProvider - Disabled plugins: []
+[main] INFO org.pf4j.DefaultPluginManager - PF4J version 0.0.0 in 'deployment' mode
+[main] INFO org.pf4j.AbstractPluginManager - Plugin 'welcome-plugin@0.0.1' resolved
+[main] INFO org.pf4j.AbstractPluginManager - Plugin 'KotlinPlugin@1.0.0' resolved
+[main] INFO org.pf4j.AbstractPluginManager - Plugin 'hello-plugin@0.0.1' resolved
+[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'welcome-plugin@0.0.1'
+[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.start()
+[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WELCOMEPLUGIN
+[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'KotlinPlugin@1.0.0'
+[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.start()
+[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KOTLINPLUGIN
+[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'hello-plugin@0.0.1'
+[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.start()
+[main] INFO org.pf4j.demo.Boot - Plugindirectory:
+[main] INFO org.pf4j.demo.Boot - build/plugins
+
+[main] INFO org.pf4j.demo.Boot - Found 3 extensions for extension point 'org.pf4j.demo.api.Greeting'
+[main] INFO org.pf4j.demo.Boot - >>> Whazzup
+[main] INFO org.pf4j.demo.Boot - >>> Welcome
+[main] INFO org.pf4j.demo.Boot - >>> Hello
+[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'welcome-plugin':
+[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'KotlinPlugin':
+[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'hello-plugin':
+[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'hello-plugin@0.0.1'
+[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.stop()
+[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'KotlinPlugin@1.0.0'
+[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.stop()
+[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'welcome-plugin@0.0.1'
+[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.stop()
+
+```
+
dependencies {
- compile 'org.pf4j:pf4j:2.0.0-SNAPSHOT'
- compile 'org.apache.commons:commons-lang3:3.0'
+ compile group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}"
+ compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+
testCompile group: 'junit', name: 'junit', version: '4.+'
}
mainClassName = 'org.pf4j.demo.Boot'
dependencies {
- compile project(':api')
- compile 'org.pf4j:pf4j:2.0.0-SNAPSHOT'
- compile 'org.apache.commons:commons-lang3:3.5'
- testCompile group: 'junit', name: 'junit', version: '4.+'
- compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
+ compile project(':api')
+ compile group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}"
+ compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+ compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
+
+ testCompile group: 'junit', name: 'junit', version: '4.+'
}
-jar {
- baseName = 'Plugin Demo'
- version = '0.1.0'
+task uberjar(type: Jar, dependsOn: ['compileJava']) {
+ zip64 true
+ from configurations.runtime.asFileTree.files.collect {
+ exclude "META-INF/*.SF"
+ exclude "META-INF/*.DSA"
+ exclude "META-INF/*.RSA"
+ zipTree(it)
+ }
+ from files(sourceSets.main.output.classesDir)
+ from files(sourceSets.main.resources)
+ manifest {
+ attributes 'Main-Class': mainClassName
+ }
+
+ baseName = "${project.name}-plugin-demo"
+ classifier = "uberjar"
}
+
package org.pf4j.demo;
import org.apache.commons.lang3.StringUtils;
+import org.pf4j.CompoundPluginDescriptorFinder;
+import org.pf4j.ManifestPluginDescriptorFinder;
+import org.pf4j.PropertiesPluginDescriptorFinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.pf4j.DefaultPluginManager;
printLogo();
// create the plugin manager
- final PluginManager pluginManager = new DefaultPluginManager();
+ final PluginManager pluginManager = new DefaultPluginManager() {
+ @Override
+ protected CompoundPluginDescriptorFinder createPluginDescriptorFinder() {
+ return new CompoundPluginDescriptorFinder()
+ // Demo is using the Manifest file
+ // PropertiesPluginDescriptorFinder is commented out just to avoid error log
+ //.add(new PropertiesPluginDescriptorFinder())
+ .add(new ManifestPluginDescriptorFinder());
+ }
+ };
// load the plugins
pluginManager.loadPlugins();
subprojects {
- apply plugin: 'java'
+ apply plugin: 'java'
- repositories {
- mavenLocal()
- mavenCentral()
- }
+ repositories {
+ mavenLocal()
+ mavenCentral()
+ }
}
+// plugin location
+ext.pluginsDir = rootProject.buildDir.path + '/plugins'
+
+task build(dependsOn: [':app:uberjar'])
-task copyPlugins() {
- doLast {
- delete 'app/plugins'
- mkdir 'app/plugins'
- subprojects.each { p ->
- if (p.path.contains(":plugins/")) {
- System.out.println("Copying plugin from " + p.path);
- copy {
- from p.projectDir.toString() + '/build/libs'
- into 'app/plugins'
- include '*.zip'
- }
- }
- }
- }
-}
--- /dev/null
+# PF4J
+pf4jVersion=2.0.0
--- /dev/null
+subprojects {
+ jar {
+ manifest {
+ attributes 'Plugin-Class': "${pluginClass}",
+ 'Plugin-Id': "${pluginId}",
+ 'Plugin-Version': "${version}",
+ 'Plugin-Provider': "${pluginProvider}"
+ }
+ }
+
+ task plugin(type: Jar) {
+ baseName = "plugin-${pluginId}"
+ into('classes') {
+ with jar
+ }
+ into('lib') {
+ from configurations.compile
+ }
+ extension('zip')
+ }
+
+ task assemblePlugin(type: Copy) {
+ from plugin
+ into pluginsDir
+ }
+}
+
+task assemblePlugins(type: Copy) {
+ dependsOn subprojects.assemblePlugin
+}
+
+build.dependsOn project.tasks.assemblePlugins
-jar {
- baseName = 'WelcomePlugin'
- version = '0.1.0'
- manifest {
- attributes 'Plugin-Class': 'org.pf4j.demo.welcome.WelcomePlugin',
- 'Plugin-Id': 'WelcomePlugin',
- 'Plugin-Version': '1.0.0',
- 'Plugin-Provider': 'Decebal Suiu'
- }
-}
-
-task plugin(type: Jar) {
- baseName = 'WelcomePlugin'
- version = '0.1.0'
- into('classes') {
- with jar
- }
- into('lib') {
- from configurations.compile
- }
- extension('zip')
-}
-assemble.dependsOn plugin
-
dependencies {
- compileOnly project(':api')
- // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already!
- compile('org.pf4j:pf4j:2.0.0-SNAPSHOT') {
- exclude group: "org.slf4j"
- }
- compile 'org.apache.commons:commons-lang3:3.5'
- testCompile group: 'junit', name: 'junit', version: '4.+'
+ // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already!
+ compileOnly project(':api')
+ compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") {
+ exclude group: "org.slf4j"
+ }
+ compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+ testCompile group: 'junit', name: 'junit', version: '4.+'
}
--- /dev/null
+version=0.0.1
+
+pluginId=welcome-plugin
+pluginClass=org.pf4j.demo.welcome.WelcomePlugin
+pluginProvider=Decebal Suiu
+pluginDependencies=
+++ /dev/null
-plugin.id=welcome-plugin
-plugin.class=org.pf4j.demo.welcome.WelcomePlugin
-plugin.version=0.0.1
-plugin.provider=Decebal Suiu
-plugin.dependencies=
-jar {
- baseName = 'HelloPlugin'
- version = '0.1.0'
- manifest {
- attributes 'Plugin-Class': 'org.pf4j.demo.hello.HelloPlugin',
- 'Plugin-Id': 'HelloPlugin',
- 'Plugin-Version': '1.0.0',
- 'Plugin-Provider': 'Decebal Suiu'
- }
-}
-
-task plugin(type: Jar) {
- baseName = 'HelloPlugin'
- version = '0.1.0'
- into('classes') {
- with jar
- }
- into('lib') {
- from configurations.compile
- }
- extension('zip')
-}
-assemble.dependsOn plugin
-
dependencies {
- compileOnly project(':api')
- // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already!
- compile('org.pf4j:pf4j:2.0.0-SNAPSHOT') {
- exclude group: "org.slf4j"
- }
- compile 'org.apache.commons:commons-lang3:3.5'
- testCompile group: 'junit', name: 'junit', version: '4.+'
+ // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already!
+ compileOnly project(':api')
+ compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") {
+ exclude group: "org.slf4j"
+ }
+ compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+ testCompile group: 'junit', name: 'junit', version: '4.+'
}
--- /dev/null
+version=0.0.1
+
+pluginId=hello-plugin
+pluginClass=org.pf4j.demo.hello.HelloPlugin
+pluginProvider=Decebal Suiu
+pluginDependencies=
+++ /dev/null
-plugin.id=hello-plugin
-plugin.class=org.pf4j.demo.hello.HelloPlugin
-plugin.version=0.0.1
-plugin.provider=Decebal Suiu
-plugin.dependencies=
buildscript {
- ext.kotlin_version = '1.1.2-2'
+ ext.kotlin_version = '1.1.2-2'
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-jar {
- baseName = 'KotlinPlugin'
- version = '0.1.0'
- manifest {
- attributes 'Plugin-Class': 'org.pf4j.demo.kotlin.KotlinPlugin',
- 'Plugin-Id': 'KotlinPlugin',
- 'Plugin-Version': '1.0.0',
- 'Plugin-Provider': 'Anindya Chatterjee'
- }
-}
-
-task plugin(type: Jar) {
- baseName = 'KotlinPlugin'
- version = '0.1.0'
- into('classes') {
- with jar
- }
- into('lib') {
- from configurations.compile
- }
- extension('zip')
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
}
-assemble.dependsOn plugin
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
repositories {
- mavenCentral()
+ mavenCentral()
}
dependencies {
- compileOnly project(':api')
- kapt('org.pf4j:pf4j:2.0.0-SNAPSHOT') {
- exclude group: "org.slf4j"
- }
- compile 'org.apache.commons:commons-lang3:3.5'
- testCompile group: 'junit', name: 'junit', version: '4.+'
- compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+ compileOnly project(':api')
+ compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") {
+ exclude group: "org.slf4j"
+ }
+ compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+ compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+
+ testCompile group: 'junit', name: 'junit', version: '4.+'
}
--- /dev/null
+version=1.0.0
+
+pluginId=KotlinPlugin
+pluginClass=org.pf4j.demo.kotlin.KotlinPlugin
+pluginProvider=Anindya Chatterjee
+pluginDependencies=
include 'api'
include 'app'
-include 'plugins/plugin1'
-include 'plugins/plugin2'
-include 'plugins/plugin3'
+
+include 'plugins'
+
+include 'plugins:plugin1'
+include 'plugins:plugin2'
+include 'plugins:plugin3'