无法使用AutoValue和IntelliJ解析符号

时间:2017-09-26 11:15:01

标签: java intellij-idea code-generation auto-value gradle-apt-plugin

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

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

我对项目的要求是:

  • IntelliJ和Gradle之间的构建应该是无缝的,不会干扰彼此的过程
  • 我需要使用IntelliJ&#39> 为每个源集创建单独的模块选项
  • 我需要使用基于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上运行构建→构建项目
  • 打开GeneratedSourcesTest类,在静态工厂方法中,所有内容编译都很好,但我收到错误:

cannot resolve symbol ‘AutoValue_GeneratedSourcesTest’

如何从IntelliJ访问AutoValue_GeneratedSourcesTest课程?

3 个答案:

答案 0 :(得分:7)

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

  1. 设置注释处理配置如下: enter image description here

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

  3. 右键单击每个新的生成的文件夹,然后选择:将目录标记为 - 生成的源根,使其标记如下: enter image description here

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

    有时会发生IDEA模块在上述结果中丢失其编译器输出路径设置。只需将其设置回默认文件夹即可。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

只需使用这些内容的build.gradle即可正常运行,无需接触intellij,源集等。

    plugins {
    id 'java'
    id "net.ltgt.apt" version "0.20"

}

apply plugin: 'idea'
apply plugin: 'net.ltgt.apt-idea'
group 'abc'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile             "com.google.auto.value:auto-value-annotations:1.6.2"
    annotationProcessor "com.google.auto.value:auto-value:1.6.2"
}