在IntelliJ和Gradle中的注解处理器

30

简而言之: 我无法配置IntelliJ使其在与gradle相同的目录中生成Java文件。

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

完整的项目可在GitLab上获得。

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

  • gradle-idea插件,用于处理Idea配置
  • gradle-apt-plugin,提供apt配置,并处理与注释处理相关的编译类路径和Idea配置(如果也应用了Idea插件)

构建脚本的相关部分(完整清单链接):

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 命令时,一切都是按预期的进行的: enter image description here
  1. 源文件 DataEncoding.java 被处理并生成了一个名为 DataEncodingEnabled.java 的Java文件,它位于
  2. /build/generated/source/apt/main 目录下,且在预期的包 com.tmtron.immutables.data
  3. 生成的文件也被编译成了 .class 文件
在 IntelliJ 中,我按 gradle-apt-plugin 文档 推荐的方法激活了注解处理: enter image description here

然后我执行./gradlew clean以确保先前的文件已被清除,然后在IntelliJ中单击Build - Build Project.

注释处理器正在执行,但问题是生成的Java文件最终出现在错误的位置:

enter image description here

它在这个位置: /build/generated/source/apt/main/build/generated/source/apt/main/com.tmtron.immutables.data
粗体部分是多余的。

我做错了什么,如何正确设置,使得IntelliJ和Gradle在同一个目录中生成文件?

备注:

  • 我当然已经尝试过只将IntelliJ注释配置中的“生产源目录”留空,但这并不起作用:然后它自动使用“generated”,我也遇到了错误路径问题。
  • IntelliJ版本为2016.3.4。
4个回答

20

现在,https://github.com/tbroyer/gradle-apt-plugin 表示:

该插件的目标是最终不再需要,因为已被内置功能取代。这将随着 Gradle 5.2IntelliJ 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是使用类时必须的,在Gradle 4.6中引入了annotationProcessor

要启用特定的编译任务处理:

compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor
}

禁用:

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

2019.1版本的IntelliJ配置怎么样?我应该删除注解处理器吗? - de.la.ru

17

更新2.2019
自Gradle 5.2以来,有一种简单的方法可以实现 - 请参见gavenkoa答案

更新5.2018

我知道的最简单的方法是使用apt-idea插件

只需在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)

ORIG ANSWER

在IntelliJ 2016.3.4中,有一个简单的解决方法可以使用父目录来解决问题:

  • 生产源目录:../main
  • 测试源目录:../test

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

已修正 GitLab项目 V0.0.2

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


13

大家好,我曾经也遇到相同的问题,但找到了一种解决这个问题的简洁方法。我正在使用需要注释处理的两个库(Lombok和MapStruct)。

我的IntelliJ版本是2019.1(如果您的版本较老,请更新),Gradle版本为5.2.1。

首先让我们配置IntelliJ:

  1. 在设置中禁用注释处理,因为我们将把所有工作都委托给Gradle:

enter image description here

  1. 将IDE操作委托给Gradle:

enter image description here

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

  1. Gradle中的依赖关系部分:

enter image description here

现在您可以从命令行和IDE中执行构建和运行。祝你好运!


非常有帮助,因为它解决了我的JHipster项目构建问题。 - abiieez
谢谢您发布这个。 - GBP

1

2019.2.x

禁用IntelliJ的注解处理器。

disableAnnotationProcessor

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

build.gradle

  • 然后运行您的Gradle任务以生成构建文件类,例如 gradle compileJava

runGradleTask

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

projectStructure

项目应该找到所有的注解和生成的源文件。希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接