Kotlin 1.7依赖解析疑问:Gradle模块1是否需声明未直接使用的Gson依赖?
Gradle依赖与Dagger编译报错问题解答
核心问题解答
即便module1没有直接使用Gson,仍然需要让module1在编译期能访问到Gson类,并非必须直接在module1添加依赖——这涉及Gradle依赖配置的传递性规则:
implementation配置的依赖是非传递暴露的:下层模块(module2)用implementation引入的Gson,上层模块(module1)仅在运行期能访问,编译期看不到该类型。- 但Dagger在注解处理阶段(编译期)需要解析Component关联的所有类型,包括module2公共接口返回的Gson类型,所以必须让module1的编译类路径包含Gson。
行业标准做法
针对下层模块公共API暴露上层模块所需类型的场景,通用两种处理方案:
- 修改下层模块依赖配置:把module2中Gson的
implementation改成api,这样Gson会被传递暴露给所有依赖module2的上层模块(包括module1),上层模块无需额外配置就能在编译期访问Gson。 - 上层模块直接添加依赖:在module1的build.gradle中直接用
implementation引入Gson,确保编译类路径包含该类型。
版本升级后报错的原因
Kotlin 1.7.20对注解处理的类型检查逻辑做了严格优化,相比1.6.10时期,Dagger的注解处理器会更严格校验所有涉及的类型是否能在当前模块的编译类路径中找到。之前版本可能因编译优化或Dagger的宽松检查绕过了校验,升级后触发合规性检查导致报错。
内容的提问来源于stack exchange,提问作者s0nicYouth
相关产品推荐
相关产品推荐

