IntelliJ 中的注释处理器和 Gradle
Annotation Processor in IntelliJ and Gradle
tl;dr:我无法将 IntelliJ 配置为在与 gradle
相同的目录中生成 java 文件
我有一个使用 immutables 注释处理器的小项目。
它在 gradle 命令行构建中按预期工作,但我无法让 IntelliJ 将生成的文件输出到同一目录。
完整项目可在 GitLab
Gradle 配置:
我使用以下 gradle 插件:
- gradle-idea plugin 处理 idea 配置
- gradle-apt-plugin提供apt配置并处理注解处理相关的compile-class路径和idea配置(如果还应用了idea插件)
构建脚本的相关部分 (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
一切都如预期的那样:
- 源文件
DataEncoding.java
被处理,生成的 java-文件 DataEncodingEnabled.java
最终在
/build/generated/source/apt/main
下预期包com.tmtron.immutables.data
- 并且生成的文件也被编译成.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 在同一目录中生成文件?
备注:
- 我当然已经尝试过将 IntelliJ 注释配置中的 "Production sources dir" 留空,但他不起作用:然后它会自动使用 "generated" 我也以错误告终路径。
- IntelliJ 版本 2016.3.4
更新 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 会将代码生成到相同的目录。
中修复
现在 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
如果使用类,annotationProcessor
在Gradle4.6.
启用处理特定编译任务:
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
要禁用:
compileTestJava {
options.compilerArgs += '-proc:none'
}
大家好,我遇到了同样的问题,并找到了解决此问题的简洁方法。
我正在使用两个需要注释处理的库(Lombok 和 MapStruct)。
另外我的 IntelliJ 是 2019.1(更新你的以防它更旧)和 Gradle 5.2.1.
首先让我们配置 IntelliJ:
- 在设置中禁用注释处理,因为我们要将所有事情委托给 Gradle:
- 将 IDE 操作委托给 Gradle:
最后一步是在 Gradle 中正确配置依赖项。
- Gradle 中的依赖项部分:
现在您可以从命令行和 IDE 执行构建和 运行。
干杯!
2019.2.x
- 禁用intellij的注解处理器
- 在你的 gradle build.gradle 文件中添加、构建目录
- 然后 运行 你的 gradle 任务生成构建文件 类,示例
gradle compileJava
- 文件 -> 项目结构 -> 模块 -> 主文件夹 ||删除排除并添加为来源
并且项目应该找到所有注释和生成的源文件。希望对你有帮助。
tl;dr:我无法将 IntelliJ 配置为在与 gradle
相同的目录中生成 java 文件我有一个使用 immutables 注释处理器的小项目。 它在 gradle 命令行构建中按预期工作,但我无法让 IntelliJ 将生成的文件输出到同一目录。
完整项目可在 GitLab
Gradle 配置:
我使用以下 gradle 插件:
- gradle-idea plugin 处理 idea 配置
- gradle-apt-plugin提供apt配置并处理注解处理相关的compile-class路径和idea配置(如果还应用了idea插件)
构建脚本的相关部分 (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
一切都如预期的那样:
- 源文件
DataEncoding.java
被处理,生成的 java-文件DataEncodingEnabled.java
最终在 /build/generated/source/apt/main
下预期包com.tmtron.immutables.data
- 并且生成的文件也被编译成.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 在同一目录中生成文件?
备注:
- 我当然已经尝试过将 IntelliJ 注释配置中的 "Production sources dir" 留空,但他不起作用:然后它会自动使用 "generated" 我也以错误告终路径。
- IntelliJ 版本 2016.3.4
更新 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 会将代码生成到相同的目录。
中修复现在 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
如果使用类,annotationProcessor
在Gradle4.6.
启用处理特定编译任务:
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
要禁用:
compileTestJava {
options.compilerArgs += '-proc:none'
}
大家好,我遇到了同样的问题,并找到了解决此问题的简洁方法。 我正在使用两个需要注释处理的库(Lombok 和 MapStruct)。
另外我的 IntelliJ 是 2019.1(更新你的以防它更旧)和 Gradle 5.2.1.
首先让我们配置 IntelliJ:
- 在设置中禁用注释处理,因为我们要将所有事情委托给 Gradle:
- 将 IDE 操作委托给 Gradle:
最后一步是在 Gradle 中正确配置依赖项。
- Gradle 中的依赖项部分:
现在您可以从命令行和 IDE 执行构建和 运行。
干杯!
2019.2.x
- 禁用intellij的注解处理器
- 在你的 gradle build.gradle 文件中添加、构建目录
- 然后 运行 你的 gradle 任务生成构建文件 类,示例
gradle compileJava
- 文件 -> 项目结构 -> 模块 -> 主文件夹 ||删除排除并添加为来源
并且项目应该找到所有注释和生成的源文件。希望对你有帮助。