Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用AutoValue和IntelliJ解析符号_Java_Intellij Idea_Code Generation_Auto Value_Gradle Apt Plugin - Fatal编程技术网

Java 无法使用AutoValue和IntelliJ解析符号

Java 无法使用AutoValue和IntelliJ解析符号,java,intellij-idea,code-generation,auto-value,gradle-apt-plugin,Java,Intellij Idea,Code Generation,Auto Value,Gradle Apt Plugin,我一直在尝试为IntelliJ的注释处理找到正确的设置,以便它与Gradle的构建过程共存 每当我从IntelliJ构建时,我都无法让它识别从中生成的源 我对我的项目的要求是: IntelliJ和Gradle之间的建筑应该是无缝的,并且不会相互干扰 我需要使用IntelliJ的“每个源集创建单独的模块”选项 我需要使用IntelliJ的基于文件夹的结构 IntelliJ需要能够识别和自动完成AutoValue类 以下是通过IntelliJ 2017.2.4和Gradle 3.5再现问题的MC

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

每当我从IntelliJ构建时,我都无法让它识别从中生成的源

我对我的项目的要求是:

  • IntelliJ和Gradle之间的建筑应该是无缝的,并且不会相互干扰
  • 我需要使用IntelliJ的“每个源集创建单独的模块”选项
  • 我需要使用IntelliJ的基于文件夹的结构
  • IntelliJ需要能够识别和自动完成AutoValue类
以下是通过IntelliJ 2017.2.4和Gradle 3.5再现问题的MCVE步骤:

  • 从IntelliJ创建一个新的Gradle项目
  • 选中“为每个源集创建单独的模块”选项
  • 打开build.gradle文件:
  • 添加以下
    插件
    块:

  • 添加以下
    依赖项

  • 转到“设置”→ 构建、执行、部署→ 注释处理器
  • 选中“启用注释处理”
  • 创建一个类:

  • 关于IntelliJ运行构建→ 建设项目
  • 打开
    GeneratedSourcesTest
    类,在静态工厂方法上,一切都可以编译,但我得到了错误:
无法解析符号“AutoValue\u GeneratedSourcesTest”

如何从IntelliJ访问
AutoValue\u GeneratedSourcesTest
类?

答案(应该)在gradle apt插件的自述文件中:

也就是说,还要应用
net.ltgt.apt idea
插件


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

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

  • 按如下方式设置注释处理配置:

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

  • 右键单击每个新生成的文件夹并选择:将目录标记为-generated Sources Root,以便将其标记为:

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


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

    只需将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"
    }
    

    再见,非常感谢。我认为idea插件迫使我使用基于文件的设置。出于代码格式的原因,我更愿意使用基于文件夹的设置。假设你指的是
    .idea/
    *.iws
    ,那么不,绝对不是。我在Idea中使用了基于文件夹的设置,与Gradle集成(而不是
    Idea
    任务),并将构建/运行操作委托给Gradle。感谢您的澄清和更正。听起来不错。我会回去调查。非常感谢。执行前两个步骤对我很有效。但是,为什么无论您使用哪种IDE,像这样的事情总是让您感到挣扎?哇!谢谢你的详细回答!同样值得一提的是,使用它可以让生活更加轻松:)
    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();
    }
    
        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"
    }