使用 gradlew + dagger @Generated注释

2022-09-01 13:53:59

我遇到了一个奇怪的问题,使用gradlew(4.10.2)+ dagger(2.18)。

问题是当我打电话时:

./gradlew :app:compileDebugAndroidTestKotlin 

生成失败,出现以下情况:

任务 :通用:编译DebugJavaWithJavac FAILED

/CommonModule_ProvidesGsonFactory.java:6: 错误: 包 javax.annotation.processing 不存在 import javax.annotation.processing.生成;

/CommonModule_ProvidesGsonFactory.java:8: 错误: 找不到符号 @生成(

但是,如果我从 Android Studio 运行该任务,则该任务会成功,并且 dagger 生成的类中不存在@Generated

你有一些线索来避免使用注释吗?@Generated./gradlew


答案 1

Dagger 使用 的来计算要使用哪个注释。它根据类路径执行此操作。auto-commonGeneratedAnnotations@Generated

这意味着,当注释处理器正在运行时,在生成器中可用和使用,但是当在另一个任务中编译生成的文件时,它不再位于类路径上。javax.annotation.processing.Generated

潜在原因可能是代码是使用较新版本的JDK生成的,增量构建无效,需要完全“清理和重建”,或者Java语言级别存在问题,其中注释处理器在Java 9 +上运行,但Android编译为Java 8或更低版本。

使用解决了问题。./gradlew compileDebugAndroidTestKotlin -Dorg.gradle.java.home=<Android studio jre path>


答案 2

如果您有:

javax 注解不存在

我在macOS上遇到此问题,发生此错误是因为您的jdk高于1.8

只需在应用程序的build.gradle上添加以下代码即可。

//Resolve jdk8+ Generation Annotations - javax annotation does not exist
compileOnly 'com.github.pengrad:jdk9-deps:1.0'

推荐