ModsJava
JExDependency | Keep Plugins small | 1.8-26.1.2
JExDependency Ship lightweight Paper & Spigot plugins. Let your server download the libraries. Runtime dependency resolution, downloading, relocation, and…
⬇ Download on Spigot
JExDependency
Ship lightweight Paper & Spigot plugins. Let your server download the libraries.
Runtime dependency resolution, downloading, relocation, and classpath injection — purpose-built for modern Minecraft servers.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ship lightweight Paper & Spigot plugins. Let your server download the libraries.
Runtime dependency resolution, downloading, relocation, and classpath injection — purpose-built for modern Minecraft servers.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Why JExDependency?
Minecraft plugin jars keep getting larger. Hibernate, Jackson, Caffeine, JDBC drivers — shading them all bloats your jar to 20 MB+ and guarantees classpath collisions the moment another plugin ships a different version.
JExDependency flips that model. Declare dependencies in a tiny YAML file, ship a 50 KB plugin, and let the library download, verify, (optionally) relocate, and inject the JARs at runtime — on every flavour of Paper and Spigot, transparently.
Think of it as Paper's built-in libraries block, but portable, relocation-aware, and working on Spigot too.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ Features
- Universal loader — Paper plugin-loader handshake on 1.20+, legacy bootstrap on Spigot/older Paper. Auto-detected.
- YAML-first descriptors — merges generic / Paper-only / Spigot-only files, deduplicates versions, normalises coordinates.
- Optional ASM relocation — isolate conflicting packages without paying the CPU cost when you don't need it.
- ⚡ Sync or async bootstrap — block onLoad() for simplicity, or return a CompletableFuture for non-blocking startup.
- Checksum-verified downloads — corrupted artifacts are retried; temp directories are wiped on every exit path.
- ☕ Java 21 ready — module de-encapsulation and --add-opens semantics handled for reflective libraries.
- Deterministic cache — artefacts live under plugins/<Plugin>/libraries/; safe to prune.
- First-class logging — every bootstrap cycle reports counts, timings, and redacted paths through the plugin logger.
For Plugin Developers
Add the dependency in Gradle:
Code (Kotlin):
repositories
{
maven ( "https://repo.jexcellence.de/releases" )
}
dependencies {
implementation ( "de.jexcellence.dependency:jexdependency:2.0.0" )
}
maven ( "https://repo.jexcellence.de/releases" )
}
dependencies {
implementation ( "de.jexcellence.dependency:jexdependency:2.0.0" )
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Replace your ShadowJar relocate blocks
If your build.gradle.kts currently looks like this:
Code (Kotlin):
tasks.
named
<com.
github.
jengelman.
gradle.
plugins.
shadow.
tasks.
ShadowJar
>
(
"shadowJar"
)
{
archiveBaseName. set ( "RDQ" )
archiveVersion. set (rdqVersion )
archiveClassifier. set ( "Free" )
relocate ( "com.github.benmanes", "de.jexcellence.remapped.com.github.benmanes" )
relocate ( "me.devnatan.inventoryframework", "de.jexcellence.remapped.me.devnatan.inventoryframework" )
relocate ( "com.tcoded", "de.jexcellence.remapped.com.tcoded" )
relocate ( "com.cryptomorin.xseries", "de.jexcellence.remapped.com.cryptomorin.xseries" )
configurations = listOf (project. configurations. getByName ( "runtimeClasspath" ) )
mergeServiceFiles ( )
}
archiveBaseName. set ( "RDQ" )
archiveVersion. set (rdqVersion )
archiveClassifier. set ( "Free" )
relocate ( "com.github.benmanes", "de.jexcellence.remapped.com.github.benmanes" )
relocate ( "me.devnatan.inventoryframework", "de.jexcellence.remapped.me.devnatan.inventoryframework" )
relocate ( "com.tcoded", "de.jexcellence.remapped.com.tcoded" )
relocate ( "com.cryptomorin.xseries", "de.jexcellence.remapped.com.cryptomorin.xseries" )
configurations = listOf (project. configurations. getByName ( "runtimeClasspath" ) )
mergeServiceFiles ( )
}
With JExDependency, the entire setup becomes:
1) build.gradle.kts — no shadow plugin required:
Code (Kotlin):
dependencies
{
implementation ( "de.jexcellence.dependency:jexdependency:2.0.0" )
// These stay as compileOnly — they're downloaded at runtime, not shaded.
compileOnly ( "com.github.ben-manes.caffeine:caffeine:3.2.2" )
compileOnly ( "me.devnatan:inventory-framework-paper:3.3.0" )
compileOnly ( "com.tcoded:FoliaLib:0.5.1" )
compileOnly ( "com.github.cryptomorin:XSeries:11.3.0" )
}
implementation ( "de.jexcellence.dependency:jexdependency:2.0.0" )
// These stay as compileOnly — they're downloaded at runtime, not shaded.
compileOnly ( "com.github.ben-manes.caffeine:caffeine:3.2.2" )
compileOnly ( "me.devnatan:inventory-framework-paper:3.3.0" )
compileOnly ( "com.tcoded:FoliaLib:0.5.1" )
compileOnly ( "com.github.cryptomorin:XSeries:11.3.0" )
}
Code (YAML):
dependencies
:
- "com.github.ben-manes.caffeine:caffeine:3.2.2"
- "me.devnatan:inventory-framework-paper:3.3.0"
- "com.tcoded:FoliaLib:0.5.1"
- "com.github.cryptomorin:XSeries:11.3.0"
- "com.github.ben-manes.caffeine:caffeine:3.2.2"
- "me.devnatan:inventory-framework-paper:3.3.0"
- "com.tcoded:FoliaLib:0.5.1"
- "com.github.cryptomorin:XSeries:11.3.0"
Code (Java):
public
final
class RDQ
extends JavaPlugin
{
@Override
public void onLoad ( ) {
// Equivalent to your old shadow relocate(...) block, at runtime.
JEDependency. initializeWithRemapping ( this, RDQ. class ) ;
}
}
@Override
public void onLoad ( ) {
// Equivalent to your old shadow relocate(...) block, at runtime.
JEDependency. initializeWithRemapping ( this, RDQ. class ) ;
}
}
Code (Text):
-Djedependency.relocations.prefix=de.jexcellence.remapped
Declare your runtime libraries in src/main/resources/dependency/dependencies.yml:
Code (YAML):
dependencies
:
- "com.github.ben-manes.caffeine:caffeine:3.2.2"
- "com.fasterxml.jackson.core:jackson-databind:2.18.2"
- "com.mysql:mysql-connector-j:9.2.0"
- "com.github.ben-manes.caffeine:caffeine:3.2.2"
- "com.fasterxml.jackson.core:jackson-databind:2.18.2"
- "com.mysql:mysql-connector-j:9.2.0"
Code (Java):
public
final
class ExamplePlugin
extends JavaPlugin
{
@Override
public void onLoad ( ) {
JEDependency. initialize ( this, ExamplePlugin. class ) ;
}
}
@Override
public void onLoad ( ) {
JEDependency. initialize ( this, ExamplePlugin. class ) ;
}
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚙️ Configuration (server operators)
All options are JVM system properties — no config file to edit.
- -Djedependency.remap=true — force ASM relocation.
- -Djedependency.relocations=pattern=target,... — custom relocation rules.
- -Djedependency.relocations.prefix=mypkg.libs — global prefix for auto-relocated packages.
- -Djedependency.relocations.excludes=com.example.keepme — packages that must never be relocated.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Security
- Maven checksum validation on every downloaded jar; corrupted files trigger a retry and cache purge.
- Remapping runs inside a sandboxed URLClassLoader so a half-relocated class can never leak into your plugin loader on failure.
- Temporary directories are wiped on both success and failure — no stale bytecode survives restarts.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Support
- Email: [email protected]
- Discord: jexcellence
- Bug reports: https://github.com/JExcellence/JExDependency/issues
- Source: https://github.com/JExcellence/JExDependency
If JExDependency saves you a shaded jar today, consider leaving a ⭐ on GitHub and a review here on SpigotMC — it genuinely helps!
Quick facts
- Edition: Minecraft Java
- File type: .jar
- Minecraft versions listed: 1.8, 1.9, 1.10
- How to install: Install the matching mod loader (Forge, Fabric or NeoForge) for your Minecraft version. → Download the .jar. → Put it in the .minecraft/mods folder and launch that loader profile.
- Where to get it: Opens on Spigot — not every file is mirrored on our own servers.
Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.
JExDependency | Keep Plugins small | 1.8-26.1.2 is a free Minecraft Java mod. Compatible with Minecraft 1.8, 1.9, 1.10, 1.11 and newer. Downloaded 23 times (via Spigot). Download it and open it directly in the game.