无法使用AutoValue和IntelliJ解析符号

Jai*_*iye 8 java code-generation intellij-idea auto-value gradle-apt-plugin

我一直在尝试为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'
}
Run Code Online (Sandbox Code Playgroud)
  • 添加以下dependencies

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

@AutoValue
public abstract class GeneratedSourcesTest {

    static GeneratedSourcesTest create(String field) {
        return new AutoValue_GeneratedSourcesTest(field);
    }

    public abstract String field();
}
Run Code Online (Sandbox Code Playgroud)
  • 在IntelliJ上运行Build→Build Project
  • 打开GeneratedSourcesTest类,在静态工厂方法,一切编译好,但我得到错误:

cannot resolve symbol ‘AutoValue_GeneratedSourcesTest’

如何AutoValue_GeneratedSourcesTest从IntelliJ访问该类?

top*_*opr 8

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

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

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

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

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

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

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


Tho*_*yer 3

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

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

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