大型多项目Gradle构建中SQLite JDBC驱动依赖解析问题
问题分析与解决
核心原因
buildSrc中使用implementation依赖sqlite-jdbc时,该依赖仅在buildSrc编译阶段可用,但不会自动加入Gradle插件执行时的运行类路径。Gradle标记(n)表示implementation配置是“仅编译”的,无需被解析为运行时依赖,这直接导致插件任务执行时找不到JDBC驱动。
解决方案
1. 调整buildSrc的依赖配置
将buildSrc/build.gradle中的implementation改为api,确保依赖被传递到插件的运行类路径:
dependencies { api 'org.sqlite:sqlite-jdbc:3.25.2' }
api配置会让依赖既参与编译,也会被包含在插件的运行时类路径中,解决驱动找不到的问题。
2. 手动注册JDBC驱动(可选兜底方案)
如果调整依赖配置后仍有问题,可以在插件代码中手动加载驱动,避免类加载器的问题:
// 在创建Sql实例前添加 Class.forName("org.sqlite.JDBC") sqlite = Sql.newInstance("jdbc:sqlite:" + dbLocation.absolutePath)
3. 检查连接字符串的正确性
从错误信息看,连接字符串出现了重复的jdbc:sqlite:前缀(jdbc:sqlitejdbc:sqlite:/...),需确认dbLocation.absolutePath是否已包含jdbc:sqlite:前缀。如果是,修改拼接逻辑:
// 若dbLocation是纯文件路径,直接拼接 sqlite = Sql.newInstance("jdbc:sqlite:" + dbLocation.absolutePath, "org.sqlite.JDBC") // 若dbLocation已经是完整JDBC URL,直接使用 // sqlite = Sql.newInstance(dbLocation.absolutePath, "org.sqlite.JDBC")
验证方法
修改依赖配置后,重新执行任务:
../../master/gradlew yourQueryTaskName
同时可查看buildSrc的runtimeClasspath确认依赖已正确包含:
cd ../../master ./gradlew buildSrc:dependencies --configuration runtimeClasspath
内容的提问来源于stack exchange,提问作者Calvin Taylor
相关产品推荐
相关产品推荐

