无法使用 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 注释反序列化类
Kapt 不适用于 Android Studio 3.0 中的 AutoValue