无法使用AutoValue和IntelliJ解析符号
我一直在尝试为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上运行Build→Build Project
- 打开
GeneratedSourcesTest
类,在静态工厂方法上,一切编译都很好,但我得到错误:
cannot resolve symbol 'AutoValue_GeneratedSourcesTest'
如何从IntelliJ访问AutoValue_GeneratedSourcesTest
类?
在IDEA下导入Gradle项目后,请执行以下步骤:
-
设置注释处理配置如下:
-
运行菜单: 构建 – 构建项目
-
右键单击每个新生成的文件夹,然后选择:将目录标记为 – 生成的源根,以便标记如下:
- 添加
/generated
到项目的.gitignore文件
- 添加
这是一个最小的可行配置,它将为生成的类提供完整的IDE支持。 缺点是,每当重新导入Gradle项目时, 生成的文件夹都需要再次标记为Generated Sources Root 。 也许这可以通过在build.gradle下添加这些路径作为源集来改进。
有时,由于上述结果,IDEA模块会丢失其编译器输出路径设置。 只需将其设置回默认文件夹就足够了。
答案是(应该)在gradle-apt-plugin的自述文件中: https : //github.com/tbroyer/gradle-apt-plugin
即,也应用net.ltgt.apt-idea
插件。
顺便说一句,我建议将构建/运行操作委派给IntelliJ中的Gradle。 当然它有点慢,但在IDE中需要零设置并且可靠地工作。 也就是说,如果你不这样做,它也应该可行。