在Bazel中使用SQLite JDBC遭遇驱动未找到问题求助
问题解决方案
一、核心问题分析
你遇到的驱动未找到错误,本质是依赖配置错误(引入了原生SQLite库而非JDBC驱动),同时代码存在SQL语法错误,需从依赖配置和代码两方面修正。
二、步骤1:修正依赖配置
修改MODULE.bazel
替换原错误的sqlite3依赖,引入官方SQLite JDBC驱动(通过Maven管理):
bazel_dep(name = "rules_java", version = "7.11.1") bazel_dep(name = "rules_jvm_external", version = "5.3") maven_install( name = "maven", artifacts = [ "org.xerial:sqlite-jdbc:3.47.2.1", ], repositories = [ "https://repo1.maven.org/maven2/", ], )
修改BUILD.bazel
在java_binary中添加正确的JDBC驱动依赖:
load("@rules_java//java:defs.bzl", "java_binary") load("@maven//:defs.bzl", "maven") package(default_visibility = ["//visibility:public"]) java_binary( name = "TestMain", srcs = glob(["com/test/TestMain.java"]), main_class = "com.test.TestMain", resources = glob(["com/test/assets/*"]), deps = [maven("org.xerial:sqlite-jdbc")], )
三、步骤2:修正Java代码
代码存在两个问题:驱动未显式加载、SQL插入语句语法错误,修正后代码如下:
import java.io.IOException; import java.sql.*; public class TestMain { public static void main(String args[]) throws IOException { try { // 显式加载SQLite JDBC驱动,确保DriverManager能识别 Class.forName("org.sqlite.JDBC"); Connection connection = DriverManager.getConnection("jdbc:sqlite:com/test/assets/sample.db"); Statement statement = connection.createStatement(); statement.setQueryTimeout(30); statement.executeUpdate("drop table if exists blog_post"); statement.executeUpdate("create table blog_post(id integer, title string, content string)"); // 修正insert语句语法:必须指定列名或按顺序匹配值 statement.executeUpdate("insert into blog_post(id, title, content) values(1, 'test','ldsjkfslkdfjl')"); statement.executeUpdate("insert into blog_post(id, title, content) values(2, 'testdd','ldsjkfslkdfjl')"); ResultSet rs = statement.executeQuery("select * from blog_post"); while(rs.next()) { System.out.println("title = " + rs.getString("title")); } // 关闭资源,避免内存泄漏 rs.close(); statement.close(); connection.close(); } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); } } }
四、运行验证
执行以下命令运行程序:
bazel run :TestMain
关键说明
- 原依赖的
sqlite3是原生C库,并非Java JDBC驱动,因此无法提供org.sqlite.JDBC类; - 显式加载驱动是为了规避Bazel类路径配置可能导致的JDBC自动加载失效问题;
- SQL插入语句必须遵循
insert into 表名(列1,列2) values(值1,值2)的语法,原写法会触发SQL执行错误。
内容的提问来源于stack exchange,提问作者Gunslinger
相关产品推荐
相关产品推荐

