【问题标题】:Cannot resolve symbol with AutoValue and IntelliJ无法使用 AutoValue 和 IntelliJ 解析符号
【发布时间】:2018-03-07 14:07:43
【问题描述】:

我一直在尝试为 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 上运行 构建 → 构建项目
  • 打开GeneratedSourcesTest类,在静态工厂方法上,一切编译正常,但出现错误:

cannot resolve symbol ‘AutoValue_GeneratedSourcesTest’

如何使 AutoValue_GeneratedSourcesTest 类可以从 IntelliJ 访问?

【问题讨论】:

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


【解决方案1】:

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

  1. 设置注解处理配置如下:

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

  3. 右键单击每个新的 generated 文件夹并选择:Mark Directory as - Generated Sources Root 所以它被标记如下:

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

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

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

【讨论】:

  • 非常感谢。执行前两个步骤对我有用。但是,无论您使用哪个 IDE,为什么像这样的事情总是让您苦苦挣扎?
  • 哇!感谢您的详细回答!还值得一提的是使用AutoValue Plugin 让生活更轻松:)
【解决方案2】:

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

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

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

【讨论】:

  • 非常感谢。我认为这个想法插件迫使我使用基于文件的设置。出于代码格式的原因,我更愿意使用基于文件夹的设置。
  • 假设您的意思是 .idea/*.iws,那么不,绝对不是。我在 Idea 中使用了基于文件夹的设置,以及 Gradle 集成(不是idea 任务),以及将构建/运行操作委托给 Gradle。
  • 感谢您的澄清和更正。听起来不错。我会回去调查的。
【解决方案3】:

只要让你的 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"
}

【讨论】:

    【解决方案4】:

    我不需要通过添加可选的 true 标签来使用 maven 对 intellij 做任何事情。

    <dependency>
        <groupId>com.google.auto.value</groupId>
        <artifactId>auto-value</artifactId>
        <version>1.9</version>
        <optional>true</optional>
    </dependency>
    

    【讨论】:

    • 我们在谈论 gradle
    • 标题显示“无法使用 AutoValue 和 IntelliJ 解析符号”,如果您使用 maven,这是一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2020-04-01
    • 1970-01-01
    • 2016-06-12
    • 2019-04-23
    • 2019-02-21
    • 2019-03-09
    相关资源
    最近更新 更多