Android集成Ucanaccess报java.sql.DriverAction类找不到错误怎么解决
问题根因
你遇到的java.lang.NoClassDefFoundError: Ljava/sql/DriverAction;报错,本质是Android运行时类库与标准JDK不兼容导致:java.sql.DriverAction是JDK 1.8版本才新增的JDBC配套接口,但Android系统内置的java.sql包做了裁剪,没有包含该接口。哪怕你本地开发环境使用OpenJDK 1.8,Android应用运行时调用的是系统自带的类库,因此会触发类找不到的异常。
可用解决方案
方案1:降级Ucanaccess到4.x版本
Ucanaccess 4.x系列基于JDK 1.7编译,不会依赖DriverAction接口,适配Android运行时环境。你需要替换现有依赖为以下版本:- ucanaccess-4.0.4.jar
- commons-lang3-3.4.jar
- commons-logging-1.2.jar
- hsqldb-2.3.1.jar
- jackcess-2.1.11.jar
替换后重新执行Gradle同步编译即可解决报错。
方案2:手动补全缺失的
DriverAction接口
如果必须使用Ucanaccess 5.x版本,你可以在项目源码中手动新增同名同包名的接口,补全运行时缺失的类:
在项目的src/main/java目录下新建java/sql层级的包,在包中创建DriverAction.java文件,代码如下:
package java.sql; public interface DriverAction { void deregister(); }
Android打包时会优先加载你自定义的这个类,即可解决类找不到的问题。该方案存在潜在类冲突风险,如果后续Android系统更新补全了该接口,可能会出现兼容问题。
- 方案3:替换技术实现方案
如果场景允许,建议优先将Access数据库转换为SQLite格式后再在Android端进行操作,无需引入JDBC相关依赖,兼容性和运行性能都更优,适合移动端场景。
内容的提问来源于stack exchange,提问作者dev404
相关产品推荐
相关产品推荐

