NonExistentClass 无法转换为 Annotation

Alf*_*ano 5 android dagger-2 retrofit2 kapt

我向我的项目添加了一个新的 Retrofit 接口,其中包含几个用@GET和注释注释的端点,在使用所述类的构造函数中的注释@HEADERS将所述接口注入到存储库类后,Android Studio 抛出此错误:@Inject

NonExistentClass cannot be converted to Annotation
Run Code Online (Sandbox Code Playgroud)

查看生成的 Java 代码后,它将@GET@HEADERS注释替换为:

@error.NonExistentClass()
Run Code Online (Sandbox Code Playgroud)

我已经尝试过以下操作:

  • 使用annotatioProcessor代替kapt

  • 设置jetifier.enabledfalsegradle.properties

  • 在我的文件generateStubs中设置truebuild.gradle

  • 在我的文件correctErrorTypes中设置truebuild.gradle

我在用着:

  • 安卓工作室3.3

  • 科特林 1.3.11

  • 匕首2.21

  • 改造2.3.0

  • 科特林

  • 卡普特

可能是匕首范围的问题吗?或者Retrofit/dagger 与新版本的Kapt 插件不完全兼容?

Dan*_*son 4

幸运的是这个问题让我弄清楚了我的问题。在将类从应用程序模块移动到库时,我引用了仅存在于调试文件夹中的注释类。gradlew install因此调试版本没问题,但在生成发布文件时调用失败。

对我来说,错误非常明确,尽管我花了很长时间才意识到 - 生成的文件实际上已将丢失的注释替换为@error.NonExistentClass()

将文件移动到主 src 集中意味着调试和发布版本都可以看到该类。我花了一段时间才弄清楚,我以为这是被 kapt 掩盖的 Dagger 问题,但实际上这只是一个普通的旧 Dagger 问题。我的建议是仔细查看您的 Dagger 设置。

  • 我认为这里的技巧是,如果您依赖的模块依赖于另一个模块/库(例如 Retrofit),但您将 Retrofit 设置为“implementation”依赖项而不是“api”依赖项,那么您的模块将不会传递性地看到它,“kapt”就会失败。 (4认同)