无法使用AutoValue和IntelliJ解析符号

我一直在尝试为IntelliJ的注释处理找到正确的设置,以便它与Gradle的构建过程共存。

每当我使用IntelliJ构建时,我都无法识别gradle-apt-plugin中生成的源代码。

我对我的项目的要求是:

  • IntelliJ和Gradle之间的构建应该是无缝的,不会干扰彼此的过程
  • 我需要使用IntelliJ的每个源集创建单独的模块选项
  • 我需要使用IntelliJ的基于文件夹的结构
  • IntelliJ需要能够识别并自动完成AutoValue类

以下是使用IntelliJ 2017.2.4和Gradle 3.5重现问题的MCVE的步骤:

  • 从IntelliJ创建一个新的Gradle项目
  • 选中“为每个源设置创建单独的模块”选项
  • 打开build.gradle文件:
  • 添加以下plugins块:

 plugins { id 'java' id 'net.ltgt.apt' version '0.12' } 
  • 添加以下dependencies

 dependencies { compileOnly 'com.google.auto.value:auto-value:1.5' apt 'com.google.auto.value:auto-value:1.5' } 
  • 转到设置→构建,执行,部署→注释处理器
  • 选中“ 启用注释处理”
  • 创建一个类:

 @AutoValue public abstract class GeneratedSourcesTest { static GeneratedSourcesTest create(String field) { return new AutoValue_GeneratedSourcesTest(field); } public abstract String field(); } 
  • 在IntelliJ上运行Build→Build Project
  • 打开GeneratedSourcesTest类,在静态工厂方法上,一切编译都很好,但我得到错误:

cannot resolve symbol 'AutoValue_GeneratedSourcesTest'

如何从IntelliJ访问AutoValue_GeneratedSourcesTest类?

在IDEA下导入Gradle项目后,请执行以下步骤:

  1. 设置注释处理配置如下: 在此处输入图像描述

  2. 运行菜单: 构建 – 构建项目

  3. 右键单击每个新生成的文件夹,然后选择:将目录标记为 – 生成的源根,以便标记如下: 在此处输入图像描述

    1. 添加/generated到项目的.gitignore文件

这是一个最小的可行配置,它将为生成的类提供完整的IDE支持。 缺点是,每当重新导入Gradle项目时, 生成的文件夹都需要再次标记为Generated Sources Root 。 也许这可以通过在build.gradle下添加这些路径作为源集来改进。

有时,由于上述结果,IDEA模块会丢失其编译器输出路径设置。 只需将其设置回默认文件夹就足够了。

答案是(应该)在gradle-apt-plugin的自述文件中: https : //github.com/tbroyer/gradle-apt-plugin

即,也应用net.ltgt.apt-idea插件。

顺便说一句,我建议将构建/运行操作委派给IntelliJ中的Gradle。 当然它有点慢,但在IDE中需要零设置并且可靠地工作。 也就是说,如果你不这样做,它也应该可行。