You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

关键说明

  1. 原依赖的sqlite3是原生C库,并非Java JDBC驱动,因此无法提供org.sqlite.JDBC类;
  2. 显式加载驱动是为了规避Bazel类路径配置可能导致的JDBC自动加载失效问题;
  3. SQL插入语句必须遵循insert into 表名(列1,列2) values(值1,值2)的语法,原写法会触发SQL执行错误。

内容的提问来源于stack exchange,提问作者Gunslinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:37:03