无法使用 AutoValue 和 IntelliJ 解析符号

Posted

技术标签:

【中文标题】无法使用 AutoValue 和 IntelliJ 解析符号【英文标题】:Cannot resolve symbol with AutoValue and 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 访问?

【问题讨论】:

见youtrack.jetbrains.com/issue/IDEA-124090 【参考方案1】:

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

    设置注解处理配置如下:

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

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

      /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,这是一种解决方法。

以上是关于无法使用 AutoValue 和 IntelliJ 解析符号的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 应用程序中从缓存中获取期间使用 @AutoValue 注释反序列化类

google autovalue

Kapt 不适用于 Android Studio 3.0 中的 AutoValue

Intellij 和 Eclipse 无法找到库工件

无法使用 sbt 在本地运行 spark 作业,但可以在 IntelliJ 中运行

Intellij/Pycharm 无法调试 Python 模块