Gradle多项目依赖继承疑问:project1无法访问PostgreSQL驱动类
问题背景
我搭建了一个Gradle多项目结构,包含project1和project2两个子项目,目录结构如下:
|_project1 | |_build.gradle.kts |_project2 | |_build.gradle.kts |_settings.gradle.kts |_build.gradle.kts
settings.gradle.kts中已包含这两个子项目。
project2的依赖配置:
dependencies { implementation("org.postgresql:postgresql:42.7.0") }
project1的依赖配置:
dependencies { implementation(project(":project2")) // 依赖project2 }
遇到的问题:无法在project1的类中直接使用/访问PostgreSQL JDBC驱动类。查看依赖图发现:
- project1的
runtimeClasspath包含:-– project :project2 -– org.postgresql:postgresql:42.7.0 -– org.checkerframework:checker-qual:3.31.0 - project1的
compileClasspath仅包含:-– project :project2
解答
1. 这是Gradle的默认行为吗?
是。Gradle的implementation依赖配置特性就是传递性依赖仅对运行时可见。当project2用implementation引入PostgreSQL驱动时,该依赖仅对project2自身的编译、运行时可见;对于依赖project2的project1来说,只能在运行时加载这个驱动,编译阶段无法访问——这就是驱动只出现在project1的runtimeClasspath里的原因。
2. 如何解决?
有两种常用方案:
方案一:修改project2的依赖配置
如果project2本身需要让上层依赖它的模块(比如project1)在编译时访问PostgreSQL驱动,把project2里的implementation替换为api:dependencies { api("org.postgresql:postgresql:42.7.0") }api配置的依赖会完整传递给所有依赖该项目的模块,编译、运行时都可见,修改后project1的compileClasspath就会包含PostgreSQL驱动,编译阶段就能直接使用相关类。方案二:在project1中直接引入驱动
如果不需要让project2把这个驱动暴露给所有上层模块,仅让project1单独在编译时访问,可以直接在project1的依赖中添加:dependencies { implementation(project(":project2")) implementation("org.postgresql:postgresql:42.7.0") }不过这种方式会重复引入依赖,虽然Gradle会自动处理版本冲突,但后续驱动版本变更时需要同时修改两个项目的配置,维护成本更高,优先推荐方案一。
内容的提问来源于stack exchange,提问作者Kal

