UCanAccess is a open-source pure-Java JDBC driver that gives you seamless access to Microsoft Access databases (.mdb, .accdb) without needing any native Windows libraries - R.I.P. OdbcJdbcBridge 🪦.
New to UCanAccess? Check out the introduction guide on Foojay.io: UCanAccess – Java MS Access JDBC Guide
-
Pure Java Power: Zero native dependencies. Runs anywhere Java 11+ is supported.
-
Drop-in Replacement: Fully compatible with previous UCanAccess versions.
-
Modern Core: Built on top of the latest Jackcess 5.1.6 and HSQLDB 2.7.4 for maximum stability and security.
-
Comprehensive SQL Support: Supports SELECT, INSERT, UPDATE, DELETE, and even complex DDL operations like
ALTER TABLE. -
Access-like Logic: Includes built-in Access functions (like
IIf,Nz, and financial functions likePMTorPV). -
Security Conscious: Regularly updated to be free of known CVEs.
-
Java Version: 11 or higher (LTS versions like Java 17 and 21 are fully supported and tested).
-
Build Tool: Maven
-
Main Dependencies:
To use UCanAccess in your project, add the following dependency.
<dependency>
<groupId>io.github.spannm</groupId>
<artifactId>ucanaccess</artifactId>
<version>5.1.7</version>
</dependency>implementation 'io.github.spannm:ucanaccess:5.1.7'implementation("io.github.spannm:ucanaccess:5.1.7")
Still on the original net.sf.ucanaccess:ucanaccess artifact? That project has had no release since 2020 and no longer receives security or compatibility updates. Switching to this fork is a drop-in, API-compatible change — no code changes required, just update your dependency coordinates:
- <groupId>net.sf.ucanaccess</groupId>
+ <groupId>io.github.spannm</groupId>
<artifactId>ucanaccess</artifactId>
- <version>5.0.1</version>
+ <version>5.1.7</version>You get current Jackcess/HSQLDB versions (with their CVE fixes), tested Java 11/17/21 support on Linux and Windows, and active maintenance — with the same JDBC driver class and connection URL you already use.
Connecting to your database is as simple as:
import java.sql.Connection;
import java.sql.DriverManager;
String url = "jdbc:ucanaccess://C:/path/to/your/database.accdb";
try (Connection conn = DriverManager.getConnection(url)) {
// your code here
}
If the .accdb/.mdb file you open contains linked tables, UCanAccess automatically opens the linked database files
so those tables can be read. Local linked paths are resolved as before, but a linked table pointing to a
network/UNC path (e.g. \\server\share\linked.accdb) is rejected by default with an AccessDeniedException —
such a path is taken verbatim from the database file, so a database from an untrusted source could otherwise make
your JVM reach out to an arbitrary host as soon as the linked table is touched.
If you trust the linked network paths in a given database, opt back in explicitly via the allowRemoteLinks
connection property:
String url = "jdbc:ucanaccess://C:/path/to/your/database.accdb;allowRemoteLinks=true";
The original project (developed by Marco Amadei and Gord Thompson) was the gold standard for Access connectivity but went quiet in 2020, leaving net.sf.ucanaccess:ucanaccess unmaintained at version 5.0.1.
As a long-time contributor and Java enthusiast, I decided to give UCanAccess a new home.
My goal is to keep this essential tool alive, maintain a high test coverage (JUnit 5), and ensure it meets modern Clean Code and SOLID standards. If you maintain a project that still depends on net.sf.ucanaccess, see Migrating from net.sf.ucanaccess above — a PR bumping the dependency is very welcome.
Got a bug to fix or a feature to add?
- Check out the Issues
- Fork the Repo
- Submit a Pull Request
Note: Please ensure your code follows the project's quality standards (Checkstyle, PMD are enforced in the build).
UCanAccess is licensed under the Apache License, Version 2.0.
|
Enjoying UCanAccess? Please leave a 🌟 to support the project! Your stars help to keep the bridge between Java and Access alive and visible. |