@@ -0,0 +1,62 @@ | |||
# 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() | |||
``` | |||
@@ -1,5 +1,6 @@ | |||
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.+' | |||
} |
@@ -3,14 +3,29 @@ apply plugin: 'application' | |||
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" | |||
} | |||
@@ -16,6 +16,9 @@ | |||
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; | |||
@@ -38,7 +41,16 @@ public class Boot { | |||
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(); |
@@ -1,26 +1,14 @@ | |||
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' | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,2 @@ | |||
# PF4J | |||
pf4jVersion=2.0.0 |
@@ -0,0 +1,32 @@ | |||
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 |
@@ -1,33 +1,9 @@ | |||
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.+' | |||
} |
@@ -0,0 +1,6 @@ | |||
version=0.0.1 | |||
pluginId=welcome-plugin | |||
pluginClass=org.pf4j.demo.welcome.WelcomePlugin | |||
pluginProvider=Decebal Suiu | |||
pluginDependencies= |
@@ -1,5 +0,0 @@ | |||
plugin.id=welcome-plugin | |||
plugin.class=org.pf4j.demo.welcome.WelcomePlugin | |||
plugin.version=0.0.1 | |||
plugin.provider=Decebal Suiu | |||
plugin.dependencies= |
@@ -1,33 +1,9 @@ | |||
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.+' | |||
} |
@@ -0,0 +1,6 @@ | |||
version=0.0.1 | |||
pluginId=hello-plugin | |||
pluginClass=org.pf4j.demo.hello.HelloPlugin | |||
pluginProvider=Decebal Suiu | |||
pluginDependencies= |
@@ -1,5 +0,0 @@ | |||
plugin.id=hello-plugin | |||
plugin.class=org.pf4j.demo.hello.HelloPlugin | |||
plugin.version=0.0.1 | |||
plugin.provider=Decebal Suiu | |||
plugin.dependencies= |
@@ -1,51 +1,28 @@ | |||
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.+' | |||
} |
@@ -0,0 +1,6 @@ | |||
version=1.0.0 | |||
pluginId=KotlinPlugin | |||
pluginClass=org.pf4j.demo.kotlin.KotlinPlugin | |||
pluginProvider=Anindya Chatterjee | |||
pluginDependencies= |
@@ -1,5 +1,8 @@ | |||
include 'api' | |||
include 'app' | |||
include 'plugins/plugin1' | |||
include 'plugins/plugin2' | |||
include 'plugins/plugin3' | |||
include 'plugins' | |||
include 'plugins:plugin1' | |||
include 'plugins:plugin2' | |||
include 'plugins:plugin3' |