A maintained fork of the dormant SQLite JDBC for Minecraft mod, now tracking the latest Xerial sqlite-jdbc release with auto-bumps whenever upstream cuts a new version.
The mod does nothing on its own — it ships the SQLite JDBC driver onto the server's classpath so other plugins/mods that want to read or write .db/.sqlite files via JDBC don't each have to bundle their own copy.
Typical consumers: Dynmap, Plan, LuckPerms, Grim Anti-Cheat, and any plugin that wants embedded SQLite without redistributing 10MB of native binaries themselves.
org.xerial:sqlite-jdbc:3.53.0.0 plus minimal loader stubs for Spigot, Forge 1.12, Forge 1.13–1.16, Forge 1.17–1.20, NeoForge 1.21+, and Fabric. The driver classes stay at their canonical org.sqlite.* paths — no relocation — so consumers find them with plain Class.forName("org.sqlite.JDBC"). META-INF/services/java.sql.Driver is preserved so the driver auto-registers with DriverManager.
The xerial driver bundles native SQLite binaries for every common platform/architecture (linux x64/aarch64, macos x64/arm64, windows x64). They get extracted to the JVM's tempdir on first use.
| Loader | MC versions | Notes |
|---|---|---|
| Bukkit / Spigot / Paper / Folia / Purpur | 1.8 → current | drop into plugins/ |
| Fabric | 1.16.1 → current | needs Fabric Loader 0.14+ |
| Forge | 1.12 → 1.20 | universal jar, no Mixins |
| NeoForge | 1.21 → current | drop into mods/ |
Java 8+ required. Plain BukkitAPI servers without Java 8 (anything older than ~1.8.8) won't be able to load any modern xerial release; that's an upstream constraint, not this mod.
CraftBukkit/Spigot/Paper have shipped sqlite-jdbc on the server's parent classloader since the 1.4-era ebeans commit. Plugin classloaders delegate parent-first, so for the default JDBC path (Class.forName("org.sqlite.JDBC") / DriverManager.getConnection) the bundled driver always wins, regardless of what's in plugins/. Tested empirically on Paper 1.12.2 and 1.21.11.
You need this mod when:
RETURNING, STRICT tables, modern UPSERT on a 1.8–1.12 server, or just to track the latest Xerial release. See Using a newer engine via the public API below.The default path uses the bundled driver. To use this mod's driver instead, your plugin softdepends on this holder and calls MinecraftSqliteJdbc.connect(url) directly:
// in your plugin.yml
softdepend: [sqlite-jdbc]
// in your plugin code
Connection c;
try {
c = MinecraftSqliteJdbc.connect("jdbc:sqlite:foo.db");
} catch (NoClassDefFoundError | ClassNotFoundException notInstalled) {
// holder isn't installed — fall back to the bundled driver
c = DriverManager.getConnection("jdbc:sqlite:foo.db");
}
MinecraftSqliteJdbc wraps a child-first URLClassLoader pointing at this jar's URL, parented to the platform classloader so org.sqlite.* must come from this jar (not the bundled chain). The returned Connection is a standard java.sql.Connection — keep your casts to java.sql.* interfaces; the impl class org.sqlite.SQLiteConnection lives in the child-first classloader and won't down-cast across the boundary.
Verified on Paper 1.12.2 (bundled engine 3.21.0) — same JVM, same boot:
baseline DriverManager.getConnection → engine 3.21.0
MinecraftSqliteJdbc.connect() → engine 3.53.0
API surface (all static):
| Method | Returns |
|---|---|
connect(String url) |
open Connection through this driver |
connect(String url, Properties props) |
as above with props |
driver() |
the java.sql.Driver instance |
engineVersion() |
SQLite engine version (e.g. "3.53.0") |
driverVersion() |
driver version string (e.g. "3.53.0.0") |
eagerInit() |
warm the classloader at plugin enable |
shutdown() |
release file handles + JNI on plugin disable |
Grim Anti-Cheat's SQLite backend uses this API automatically when this holder is installed and ships a newer engine than the bundled one — see Grim's Database wiki page.
For reference if you're wondering what engine version your server actually ships:
| CraftBukkit / Paper line | Bundled SQLite engine |
|---|---|
| 1.8 – 1.10 | 3.7.2 |
| 1.11 | 3.16.1 |
| 1.12 | 3.21.0.1 |
| 1.13 | 3.25.2 |
| 1.14 | 3.28.0 |
| 1.15 | 3.30.1 |
| 1.16 – 1.17 | 3.34.0 |
| 1.20.6 | 3.45.3.0 |
| Paper 1.21.4 | 3.47.0.0 |
| Paper 1.21.5 – 1.21.11 | 3.49.1.0 |
| master / 26.x | 3.51.3.0 |
This mod ships engine 3.53.0.0 (or whatever the latest xerial release is), but none of that matters on Bukkit-family servers — the bundled engine is what actually runs your queries. If you need a newer engine for features like RETURNING (3.35+) or STRICT tables (3.37+), upgrade to a Paper version that bundles a recent enough driver, or move that workload to Fabric/NeoForge where you can control the driver.
Declare sqlite-jdbc as compileOnly:
compileOnly("org.xerial:sqlite-jdbc:3.53.0.0")
Probe at startup:
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
getLogger().warning("SQLite backend disabled — install minecraft-sqlite-jdbc");
return;
}
try (Connection c = DriverManager.getConnection("jdbc:sqlite:" + dataDir.resolve("data.db"))) {
// ...
}
On Paper 1.17+ each plugin's classloader is isolated. Add this mod to your plugin.yml softdepend so the driver classes are visible to your plugin:
softdepend: [minecraft-sqlite-jdbc]
Fabric and NeoForge unify all mods on one classloader, so no equivalent declaration is needed there.
The jar version tracks Xerial's sqlite-jdbc release one-to-one. 3.53.0.0+2026-04-14 ships engine 3.53.0.0; the suffix is the build date. A scheduled GitHub Action checks Maven Central daily — when xerial cuts a new release, an auto-merge PR opens here and the Modrinth release goes out automatically.
Apache 2.0 (Xerial / Taro L. Saito). The repackage adds no functional changes and inherits that license. Full text in LICENSE.
Issues, source: GitHub.
Optional
Optional
Terms for using, modifying and redistributing this product.
06.06.2026 · Modrinth
ci: fix unterminated quote in version echo
Screenshots and images from the original Modrinth page.

Published versions and original Modrinth files.
06.06.2026 · 4 376 downloads
ci: fix unterminated quote in version echo
06.06.2026 · 83 downloads
Automated bump to version 3.53.2.0.
07.05.2026 · 1 778 downloads
Automated bump to version 3.53.1.0.
26.04.2026 · 433 downloads
modrinth body: document the public API + holder-driven engine upgrade
Recasts the 'this mod is inert on Bukkit' framing into the two-path
distinction:
Adds API table + softdepend + code snippet so consumer plugin authors
can wire it up. Cross-references Grim's wiki for the auto-detection
integration.
26.04.2026 · 31 downloads
api: child-first classloader workaround in MinecraftSqliteJdbc
Bukkit/Spigot/Paper bundle sqlite-jdbc on the server's parent classloader.
Plugin classloaders delegate parent-first, so any consumer plugin that does
Class.forName("org.sqlite.JDBC") or DriverManager.getConnection always
resolves to the bundled driver — installing this holder mod has no effect
under default semantics, regardless of what's in plugins/.
Verified empirically across paper-1.12.2 (engine 3.21.0 bundled) and
paper-1.21.11 (engine 3.49.1.0 in libraries/) — the holder loads as a
plugin but its driver class is never consulted, DriverManager registers
only the bundled driver, sqlite_version() returns the bundled engine.
This commit adds a public API class that gives consumers an explicit
escape hatch: a child-first URLClassLoader pointing at this holder's own
jar, parented to the platform classloader so org.sqlite.* must come from
the holder jar (the parent chain has no org.sqlite). The Driver loaded
from this classloader has a distinct class identity from the bundled
copy, so DriverManager.getConnection still hits bundled but
MinecraftSqliteJdbc.connect() returns a connection through the holder's
engine.
Verified on paper-1.12.2 in the same JVM:
baseline DriverManager → engine 3.21.0
child-first holder API → engine 3.53.0
API surface:
Connection connect(String url)
Connection connect(String url, Properties properties)
Driver driver()
String engineVersion()
String driverVersion()
void eagerInit()
void shutdown()
Caveats are documented in the class javadoc — chiefly: stick to
java.sql.* interfaces (the impl class org.sqlite.SQLiteConnection lives
in the child-first classloader and won't down-cast across boundaries),
DriverManager.getConnection won't pick this driver up (use connect()
directly), and the native SQLite library is extracted twice when both
bundled and holder are in use (one extraction per classloader).
DEFAULT PATH IS UNCHANGED
Consumer plugins that don't need a newer engine continue to use
DriverManager.getConnection like always — they pick up the bundled
driver and don't need to softdepend on this holder. Install this holder
only on Fabric/NeoForge (no bundled driver) or when you specifically
want a newer SQLite engine than what your server bundles.
INTEGRATION
Grim's SqliteBackend wires this in: probes for MinecraftSqliteJdbc at
init, compares engineVersion() to the bundled, routes through the
holder when it's strictly newer. Lets a Paper 1.8-1.12 server use
modern UPSERT writers (which need engine 3.24+) by installing this mod.
Implementation moved to a separate :api Gradle subproject with Java 8
toolchain so the API class compiles to bytecode runnable on every
supported MC server. Root project keeps default toolchain to coexist
with the neoforge-1.21 subproject's Java 21 requirement.
26.04.2026 · 28 downloads
modrinth body: holder is functionally inert when bundled driver exists
Tested empirically (paper-1.12.2 with engine 3.21.0 bundled, paper-1.21.11
with engine 3.49.1.0 in libraries/) — the bundled driver wins driver-class
resolution every time, regardless of whether the holder is installed.
Plugin classloaders delegate to the server parent classloader first;
parent already holds org.sqlite.JDBC / com.mysql.cj.jdbc.Driver; holder's
PluginClassLoader is never consulted; DriverManager only ever has the
bundled driver registered.
Body now states this directly so operators don't install the mod
expecting it to upgrade their bundled driver. Holder remains useful on
Fabric/NeoForge (no bundled) and Bukkit forks that strip the driver.
25.04.2026 · 30 downloads
modrinth: managed body.md + auto-sync workflow
Adds .modrinth/body.md as the source-of-truth for the Modrinth project body,
and a separate workflow that PATCHes the project on every push that touches
body.md. Description fixes don't have to wait for a version bump.
Aligns with the body-sync pattern used in the four sibling holder repos
(minecraft-{postgresql-jdbc,mysql-jdbc,mongodb-driver,jedis}).
14.04.2026 · 492 downloads
Automated bump to version 3.53.0.0.
17.03.2026 · 932 downloads
Automated bump to version 3.51.3.0.
10.02.2026 · 1 777 downloads
Automated bump to version 3.51.2.0.
02.01.2026 · 1 753 downloads
Bump dependencies
13.11.2025 · 1 993 downloads
Automated bump to version 3.51.0.0.
13.11.2025 · 75 downloads
Automated bump to version 3.50.3.0.
13.11.2025 · 72 downloads
Automated bump to version 3.50.2.0.
13.11.2025 · 105 downloads
Automated bump to version 3.50.1.0.
12.07.2025 · 6 814 downloads
Fix Neoforge 1.21+ support
20.04.2025 · 1 045 downloads