Android项目跨模块使用注解遇Unresolved reference问题求助
问题原因
核心问题是依赖传递性配置错误:
- 当Module A使用
annotationProcessor(Java项目)或kapt(Kotlin项目)依赖Module B时,这种依赖属于编译时仅需依赖,Gradle不会将Module B的代码(包括注解类)暴露给依赖Module A的Module C。 - 注解本身是需要在代码中直接引用的类,必须通过
api或implementation依赖才能让下游模块(Module C)访问到。
解决方法
根据你的项目结构,有两种可行的调整方案:
方案1:调整Module A对Module B的依赖配置
如果Module B中同时包含注解定义和注解处理器代码,修改Module A的构建脚本(build.gradle/build.gradle.kts):
- 用
api依赖Module B的注解部分(让依赖能传递到Module C) - 用
annotationProcessor/kapt单独依赖注解处理器部分
Kotlin项目示例:
// Module A的build.gradle.kts dependencies { // 让Module C能访问到Module B中的注解类 api(project(":module-b")) // 仅Module A编译时使用注解处理器 kapt(project(":module-b")) }
Java项目示例:
// Module A的build.gradle dependencies { api project(':module-b') annotationProcessor project(':module-b') }
方案2:拆分Module B为注解模块和处理器模块(推荐更清晰的架构)
如果Module B的注解和处理器代码耦合度低,建议拆分:
- 创建Module D(纯注解模块):仅包含注解定义,使用
java-library/kotlin-library插件 - 修改Module B(注解处理器模块):依赖Module D,仅保留处理器代码
- 修改Module A的依赖:
api(project(":module-d"))(让Module C能拿到注解)kapt(project(":module-b"))(编译时用处理器)
- Module C依赖Module A后,就能直接引用Module D中的注解
额外检查项
- 确保Module B/Module D的构建脚本中,没有使用
compileOnly等限制依赖传递的配置 - 同步Gradle后,执行
./gradlew moduleC:compileDebugSources(或对应变体),检查控制台是否有其他隐藏错误 - 确认注解类的包名正确,Module C中的导入语句无拼写错误
内容的提问来源于stack exchange,提问作者이범수
相关产品推荐
相关产品推荐

