IntelliJ 中的注释处理器和 Gradle

Annotation Processor in IntelliJ and Gradle

tl;dr:我无法将 IntelliJ 配置为在与 gradle

相同的目录中生成 java 文件

我有一个使用 immutables 注释处理器的小项目。 它在 gradle 命令行构建中按预期工作,但我无法让 IntelliJ 将生成的文件输出到同一目录。

完整项目可在 GitLab

Gradle 配置:
我使用以下 gradle 插件:

构建脚本的相关部分 (link to the full listing):

apply plugin: 'java'
apply plugin: "net.ltgt.apt"
apply plugin: 'idea'

dependencies {
    def immutablesVersion = '2.3.9'
    compileOnly "org.immutables:value:$immutablesVersion:annotations"
    compileOnly "org.immutables:encode:$immutablesVersion"
    apt "org.immutables:value:$immutablesVersion"
}

当我开始时 ./gradlew build 一切都如预期的那样:

  1. 源文件 DataEncoding.java 被处理,生成的 java-文件 DataEncodingEnabled.java 最终在
  2. /build/generated/source/apt/main下预期包com.tmtron.immutables.data
  3. 并且生成的文件也被编译成.class文件

在 IntelliJ 中,我按照 gradle-apt-plugin docs 的建议激活注释处理:

然后我执行 ./gradlew clean 以确保以前的文件都消失了,然后我在 IntelliJ 中单击 Build - Build Project
注释处理器已执行,但问题是生成的 java 文件最终位于错误的位置:

位于:/build/generated/source/apt/main/build/generated/source/apt/main/com.tmtron.immutables.data
粗体部分是多余的。

我哪里做错了,如何正确设置,以便 IntelliJ 和 gradle 在同一目录中生成文件?

备注:

更新 2.2019
自 Gradle 5.2 以来,有一种简单的方法可以做到这一点 - 请参阅 gavenkoas

2018 年 5 月更新

据我所知,最简单的方法是使用 apt-idea plugin

只需激活build.gradle文件中的插件即可:

plugins {
    id 'java'
    id 'net.ltgt.apt-idea' version "0.15"
}

然后将注释处理器添加到 annotationProcessor 配置中:

final DAGGER_VER = '2.16'
dependencies {
    implementation "com.google.dagger:dagger:${DAGGER_VER}"
    annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}"
}

GitHub 上的测试项目:ex.dagger
(使用 IntelliJ 2018.1.4,Gradle 4.7)

原始答案

有一个使用父目录的简单解决方法,它在 IntelliJ 2016.3.4 中运行良好

  • 制作源目录:../main
  • 测试源目录:../test

现在 gradle 和 IntelliJ 会将代码生成到相同的目录。

已在 GitLab project V0.0.2

中修复

另请参阅:apt-gradle-plugin issue#35

现在 https://github.com/tbroyer/gradle-apt-plugin 状态:

The goal of this plugin was to eventually no longer be needed, being superseded by built-in features. This is becoming a reality with Gradle 5.2 and IntelliJ IDEA 2019.1.

所以:

dependencies {
  compile("com.google.dagger:dagger:2.18")
  annotationProcessor("com.google.dagger:dagger-compiler:2.18")

  compileOnly("com.google.auto.factory:auto-factory:1.0-beta6")
  annotationProcessor("com.google.auto.factory:auto-factory:1.0-beta6")

  compileOnly("org.immutables:value-annotations:2.7.1")
  annotationProcessor("org.immutables:value:2.7.1")
}

compileOnly如果使用注解是必须的,compile如果使用类,annotationProcessorGradle4.6.

启用处理特定编译任务:

compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor
}

要禁用:

  compileTestJava {
      options.compilerArgs += '-proc:none'
  }

大家好,我遇到了同样的问题,并找到了解决此问题的简洁方法。 我正在使用两个需要注释处理的库(Lombok 和 MapStruct)。

另外我的 IntelliJ 是 2019.1(更新你的以防它更旧)和 Gradle 5.2.1.

首先让我们配置 IntelliJ:

  1. 在设置中禁用注释处理,因为我们要将所有事情委托给 Gradle:

  1. 将 IDE 操作委托给 Gradle:

最后一步是在 Gradle 中正确配置依赖项。

  1. Gradle 中的依赖项部分:

现在您可以从命令行和 IDE 执行构建和 运行。

干杯!

2019.2.x

  • 禁用intellij的注解处理器

  • 在你的 gradle build.gradle 文件中添加、构建​​目录

  • 然后 运行 你的 gradle 任务生成构建文件 类,示例 gradle compileJava

  • 文件 -> 项目结构 -> 模块 -> 主文件夹 ||删除排除并添加为来源

并且项目应该找到所有注释和生成的源文件。希望对你有帮助。