@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-common
的 GeneratedAnnotations
来确定要使用哪个 @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.生成”。
由于某些原因,我无法升级项目中的任何依赖项。在这种情况下对我有用的是:
- 不仅 安装 Java 8 而不是任何更高的 Java 版本(您可以从这里下载,例如:https://www.oracle.com/ru/java/technologies/javase/javase-jdk8-downloads.html),
- 还要检查项目结构 -> SDK 位置 -> JDK 位置 并确保此文件夹确实包含 jdk。例如,正确的选项可以以 JAVA_HOME 开头。
我的情况是,经过一些更新后,此位置默认设置为嵌入式 JDK,其中不包含任何 jdk 作为 Android 的新手,我花了花了几个小时试图弄清楚我的 Java 8.
出了什么问题
我在使用 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-common
的 GeneratedAnnotations
来确定要使用哪个 @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.生成”。 由于某些原因,我无法升级项目中的任何依赖项。在这种情况下对我有用的是:
- 不仅 安装 Java 8 而不是任何更高的 Java 版本(您可以从这里下载,例如:https://www.oracle.com/ru/java/technologies/javase/javase-jdk8-downloads.html),
- 还要检查项目结构 -> SDK 位置 -> JDK 位置 并确保此文件夹确实包含 jdk。例如,正确的选项可以以 JAVA_HOME 开头。
我的情况是,经过一些更新后,此位置默认设置为嵌入式 JDK,其中不包含任何 jdk 作为 Android 的新手,我花了花了几个小时试图弄清楚我的 Java 8.
出了什么问题