使用gradlew + dagger生成注释的@Generated注解

33

我在使用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(

但如果我在Android Studio中运行任务,任务将成功,并且dagger生成的类中不会出现@Generated

您有什么线索可以避免使用./gradlew时的@Generated注释吗?
6个回答

29

如果您遇到以下问题:

javax注释不存在

我在我的macOS上遇到了这个问题。出现此错误是因为您的JDK版本高于1.8。

只需在您应用的build.gradle文件中添加以下代码即可解决。

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

2
我在 macOS 上也遇到了同样的问题,添加这个解决了我的问题 :y: - Nazanin Nasab
1
是的,这解决了问题。正确。 - Aris_choice
1
这解决了我的问题,同时也适用于我的 M1 和 macOS。 - Kerem Kusmezer
1
太棒了,这解决了我在Ubuntu 20.04上的问题。 - Niranjan Nlc
1
不知道这个做了什么,但是它起作用了。 - Pawan Acharya

27

Dagger 使用 auto-commonGeneratedAnnotations 来确定使用哪个 @Generated 注解。它基于类路径执行此操作。

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

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

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


11
有效地,我一直在使用系统JDK(Java 9)运行./gradlew。使用./gradlew compileDebugAndroidTestKotlin -Dorg.gradle.java.home=<Android Studio JRE路径>解决了这个问题。谢谢 :) - crgarridos
这是一个很好的区别 - 使用播放按钮构建成功,因为IDE使用了作为Android Studio一部分包含的JDK。谢谢。 - dazza5000
@crgarridos 先生,您救了我好几个小时!我爱您! - noloman
3
如何在不使用命令行参数的情况下设置JRE路径:
  1. 找到Java安装目录中jre文件夹的完整路径。
  2. 将该路径添加至系统环境变量中的PATH变量中。
  3. 重启终端或应用程序以使更改生效。
- luca992
我必须说,谢谢你,这个回复救了我的命!! - Travis

14

2
在我的情况下,我改变了“Gradle JDK”,这样就可以完美地工作了。 前往“文件==>项目结构==>SDK位置==>Gradle设置==>然后从下拉菜单中更改所选gradle JDK” 希望这将对你有所帮助。

2

更改为嵌入式Android Studio版本,并仅进行清理!(不重新构建)改进@kiskae的答案。


1
我在Android Studio构建Gradle项目时遇到了“package javax.annotation.processing does not exist import javax.annotation.processing.Generated”的错误提示。由于某些原因,我不能升级项目中的任何依赖项。在这种情况下对我有用的解决方法是:
  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有什么问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接