Building from Source
XDiscordUltimate is built with Gradle and thecom.gradleup.shadow plugin. The output is a single shaded JAR ready to drop into a server’s plugins/ directory.
Prerequisites
Build Steps
Verify your JDK
Build the shaded JAR
shadowJar produces the distributable artifact. The Gradle wrapper script (gradlew) downloads the correct Gradle version automatically, so you do not need Gradle installed system-wide../gradlew shadowJar -x test. For a clean rebuild, run ./gradlew clean shadowJar.
Relevant build.gradle
The build file declares the project coordinates, Java toolchain, repositories, and dependencies. The parts that matter for contributors:
JDA, HikariCP, and every JDBC driver are declared
compileOnly. The libby-bukkit runtime loader (LibraryManager) downloads them at server startup, which keeps the published JAR small and avoids classpath conflicts with other plugins. Only Libby itself is implementation and actually shaded into the JAR.The uploadToDiscord Task
The build defines a convenience task that posts the freshly built JAR to a Discord webhook:
Because
build.finalizedBy uploadToDiscord, running ./gradlew build always attempts the upload as its final step. The task is guarded by onlyIf: if DISCORD_WEBHOOK_URL is not present in a .env file at the project root, it prints a skip notice and does nothing. It never fails the build and never sends anything unless you opt in by setting the variable../gradlew shadowJar directly — that task has no dependency on uploadToDiscord.
Running Tests
junit-jupiter) and Mockito (mockito-core). SQLite’s JDBC driver is on the test classpath so persistence code can be exercised against an in-memory database. Notable coverage includes DiscordRateLimiterTest, which validates the bot’s request-throttling logic.
Test reports are written to build/reports/tests/test/index.html.
Next Steps
Contributing
Turn your local build into a pull request.

