我正在将intellij(2019.1.1)用于java gradle(5.4.1)项目,并使用lombok(1.18.6)来自动生成代码。 Intellij将生成的源放在out/production/classes/generated/...
下,gradle将它们放在build/generated/sources/...
这很好,我喜欢intellij使其自身的构建工件与等级分开,但是,intellij在运行项目时似乎在两个目录中查找,并且抱怨生成的类重复。 将IntelliJ与gradle和自动生成的源一起使用的最佳实践是什么?你:
更新:为了澄清这种情况,问题不在于lombok自动生成的代码,而是与hibernate-jpamodelgen有关。问题仍然是相同的(生成的源重复),但我想澄清的是它是jpamodelgen生成的源,而不是lombok。
更新2 :我尝试了以下配置,以告诉intellij生成的源代码在哪里,并告诉intellij忽略构建目录。不幸的是,这没有用(在生成的源文件上仍然出现重复的类错误)。
apply plugin: 'idea'
idea {
module {
sourceDirs += file('out/production/classes/generated')
generatedSourceDirs += file('out/production/classes/generated')
excludeDirs += file('build')
}
}
更新3 : 尝试了M.Riccuiti的建议,并删除了build /,out / 、. idea / 、. gradle /,并重新导入了gradle项目,但是intellij仍在build /目录中看到生成的源代码。
答案 0 :(得分:1)
我在先前的评论中提出的解决方案在IDEA 2018.3.x中运行良好,但是升级到IDEA 2019.1之后,我再次遇到了重复的类异常...
以下是一个可行的解决方案,可以与Gradle 5.x(已通过5.4测试)和IDEA 2019.1一起使用,以实现您认为最好的解决方案#3(不要混合gradle和idea生成的输出目录,并且不要委托IDEA操作执行Gradle)
关键点是使用excludeDirs
扩展名的idea.module
属性,使IDEA忽略build/generated/sources/...
下Gradle管理的生成源。
ext {
// path to Gradle generated main sources directory
gradleGeneratedMainSourcesDir = "$buildDir/generated/sources/annotationProcessor/java/main/"
// path to Gradle generated test sources directory
gradleGeneratedTestSourcesDir = "$buildDir/generated/sources/annotationProcessor/java/test/"
// path to IDEA generated sources directory
ideaGeneratedSourcesDir = "$projectDir/out/production/classes/generated"
}
idea {
module {
// exclude main & test sources generated by Gradle from project source directories
excludeDirs += file(gradleGeneratedMainSourcesDir)
excludeDirs += file(gradleGeneratedTestSourcesDir)
// include generated sources directory managed by IDEA
sourceDirs += file(ideaGeneratedSourcesDir)
generatedSourceDirs += file(ideaGeneratedSourcesDir)
}
}
在此处查看基于此配置的完整示例项目:https://github.com/mricciuti/sample-springboot-gradle-idea
答案 1 :(得分:0)
这是一种最终对我有用的方法。诀窍是要注意,当gradle生成类时,会将它们放入:
build\generated\sources\annotationProcessor\java\main\com...
但是在这种情况下,intellij将生产来源目录设置为“生成”,来源转到:
build\generated\sources\annotationProcessor\java\main\generated\com...
如果先使用gradle进行编译,然后再使用idea,则会同时获得它们,从而导致问题!
要解决此问题,只需使用“ /”替换intellij注释处理器“生产源目录”和“测试源目录”配置中的“ generated”和“ generated_test”,这将使gradle和intellij都在SAME中生成源目录,根据需要相互覆盖。还要确保将“相对于存储生成的源”设置为“模块内容根”,并重建应用程序以清除任何其他源。
答案 2 :(得分:0)
您可以输入IntelliJ设置(首选项):
首选项|构建,执行,部署|生成工具|摇篮|跑步者
然后您选中复选框将IDE构建/运行操作委托给Gradle
最后,您清理并重新构建。问题将得到解决。