IntelliJ和Gradle中的注释处理器

时间:2017-02-24 15:02:46

标签: intellij-idea gradle annotation-processing

tl; dr :我无法配置IntelliJ以在与gradle相同的目录中生成java文件

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

完整项目可在GitLab

上找到

Gradle config
我使用下面的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时,一切都如预期的那样: enter image description here

  1. 处理源文件DataEncoding.java生成的java文件DataEncodingEnabled.java最终在
  2. 中 预期包/build/generated/source/apt/main 下的
  3. com.tmtron.immutables.data
  4. 并且生成的文件也被编译为.class文件
  5. 在IntelliJ中,我按照gradle-apt-plugin docs的建议激活注释处理: 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注释配置中为空,但是他不起作用:然后它自动使用"生成"而且我最终走错了路。
    • IntelliJ版本2016.3.4

4 个答案:

答案 0 :(得分:11)

更新2.2019
从Gradle 5.2开始,有一种简单的方法 - 请参阅gavenkoa s answer

更新5.2018

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

只需激活long TotalWeight = _ctx.ProductsToUsers.Where(pu => pu.UserId == subDetails.user.Id) .SelectMany(pu => pu.CropData).Sum(cd => Convert.ToInt64(cd.Weight)); 文件中的插件:

build.gradle

然后将注释处理器添加到plugins { id 'java' id 'net.ltgt.apt-idea' version "0.15" } 配置:

annotationProcessor

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

ORIG ANSWER

使用parent-dir有一个简单的解决方法,可以在IntelliJ 2016.3.4中正常工作

  • 生产来源目录:final DAGGER_VER = '2.16' dependencies { implementation "com.google.dagger:dagger:${DAGGER_VER}" annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}" }
  • 测试来源目录:../main

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

已修复GitLab project V0.0.2

另见:apt-gradle-plugin issue#35

答案 1 :(得分:4)

现在https://github.com/tbroyer/gradle-apt-plugin声明:

  

此插件的目标是最终不再需要,已被内置功能取代。 5.2版 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,是 4.6版中引入的annotationProcessor

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

compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor
}

要禁用:

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

答案 2 :(得分:3)

嘿,每个人都有同样的问题,并且找到了解决此问题的干净方法。 我正在使用两个需要批注处理的库(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中执行Build and Run。

干杯!

答案 3 :(得分:0)

2019.2.x

  • 禁用intellij的注释处理器

disableAnnotationProcessor

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

build.gradle

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

runGradleTask

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

projectStructure

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