PDM
The Plugin Dependency Manager
PDM IS STILL IN ALPHA! - Nothing is guaranteed to work and every update could include breaking changes!
PDM aims to reduce the amount of shading that plugin authors have to do by creating a central repository for storing libraries.
This is done in the form of a new directory - plugins/PluginLibraries
Jars are downloaded to this directory and loaded into the classpath of plugins that need them.
Why is this useful?
- Reduce overall Jar Size
- No need to relocate dependencies
- Reduce build time when dealing with many libraries
- PDM is small! It uses absolutely no external dependencies that aren't provided by Spigot, making the size footprint of using it tiny - less than 50 KB!
How to Use
PDM is incredibly simple. Usage involves 2 processes:
- Declaring Dependencies
- Loading Dependencies
Declaring Dependencies
There are 2 ways of doing Dependency Declaration:
- Programmatically
- JSON File
Declaration can be done programmatically or via JSON file:
Programmatically (Java):
Create a new PluginDependencyManager
with PDMBuilder
, and call PluginDependencyManager#loadAllDependencies
For example:
PluginDependencyManager dependencyManager = PluginDependencyManager.of(this);
CompletableFuture<Void> onLoad = dependencyManager.loadAllDependencies();
//loadAllDependencies is async, the returned future is completed when downloading and loading completes
onLoad.thenRun(() -> System.out.println("Everything is loaded!"));
JSON Based:
Make a file called dependencies.json
in your resources directory.
It should follow a format similar to this example:
{
"repositories": {
"jitpack": "https://jitpack.io"
},
"dependencies": [
{
"groupId": "com.github.knightzmc",
"artifactId": "fluency",
"version": "1.0",
"repository": "jitpack"
}
]
}
This file's contents will be loaded automatically and downloaded.
Loading
Loading the dependencies is as simple as calling PluginDependencyManager#loadAllDependencies
This will return a CompletableFuture<Void>
which is completed when all libraries are loaded.
That's it! All dependencies should be downloaded and loaded into the classpath, including transitive dependencies. Any that failed will be logged and handled gracefully.
Gradle Plugin
PDM also includes a Gradle Plugin to automatically generate a dependencies.json
file!
This is the recommended approach, as it does 99% of the work for you and is much more extendable.
This is a basic example of the usage:
plugins {
id "me.bristermitten.pdm" version "0.0.28" //Replace with the latest version
}
dependencies {
compileOnly "org.spigotmc:spigot-api:1.16.3-R0.1-SNAPSHOT"
pdm "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72" //This will be added to the dependencies.json
}
jar.dependsOn project.tasks.getByName("pdm") //Always run the pdm task when we build. Alternatively, just run [gradle pdm build]
A full example can be found here.