@Generated注解使用gradlew + dagger

@Generated annotation using gradlew + dagger

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

问题是当我调用:

./gradlew :app:compileDebugAndroidTestKotlin 

构建失败:

Task :Common:compileDebugJavaWithJavac FAILED

/CommonModule_ProvidesGsonFactory.java:6: error: package javax.annotation.processing does not exist import javax.annotation.processing.Generated;

/CommonModule_ProvidesGsonFactory.java:8: error: cannot find symbol @Generated(

但是如果我运行任务from Android Studio,任务成功并且@Generated出现在生成的匕首中class.

你有什么线索可以避免使用 ./gradlew@Generated 注释吗?

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> 解决了问题。

更改为嵌入式 Android 工作室版本并且只清理!(不重建)改进@kiskae 回答

我在将 Android Studio 更新到 4.2

时遇到了这个问题

当我将 Kotlin 版本从 1.3.51 升级到 1.4.31 时问题解决了

看来问题已在本期报告并解决:

如果你有:

javax annotation does not exist

我的 macOS 有这个问题 发生此错误是因为您的 jdk 高于 1.8

只需在您的 build.gradle 个应用中添加以下代码。

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

在尝试使用 Gradle 构建项目时,我在 Android Studio 中还收到“包 javax.annotation.processing 不存在导入 javax.annotation.processing.生成”。 由于某些原因,我无法升级项目中的任何依赖项。在这种情况下对我有用的是:

  1. 不仅 安装 Java 8 而不是任何更高的 Java 版本(您可以从这里下载,例如:https://www.oracle.com/ru/java/technologies/javase/javase-jdk8-downloads.html),
  2. 还要检查项目结构 -> SDK 位置 -> JDK 位置 并确保此文件夹确实包含 jdk。例如,正确的选项可以以 JAVA_HOME 开头。

我的情况是,经过一些更新后,此位置默认设置为嵌入式 JDK,其中不包含任何 jdk 作为 Android 的新手,我花了花了几个小时试图弄清楚我的 Java 8.

出了什么问题