我正在使用intellij(2019.1.1)进行java gradle(5.4.1)项目,并使用lombok(1.18.6)自动生成代码。 Intellij将生成的源放在out/production/classes/generated/...
下,gradle将它们放在build/generated/sources/...
下
这很好,我喜欢intellij保持它自己的构建工件与gradles分开,但是,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 /目录中看到生成的源。
我在之前的评论中提出的解决方案在IDEA 2018.3.x中运行良好但在升级到IDEA 2019.1之后我再次得到了这个重复的类异常......
下面是一个工作解决方案,使用Gradle 5.x(用5.4测试)和IDEA 2019.1来实现你的解决方案#3,我认为这是最好的选择(不要混合gradle和idea生成的输出目录,不要代表IDEA行动做Gradle)
关键点是使用来自excludeDirs
扩展的idea.module
属性来使IDEA忽略由Gradle在build/generated/sources/...
下管理的生成源
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
这是一种最终对我有用的方法。诀窍是要注意,当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目录中生成源,覆盖彼此根据需要。还要确保“存储生成的源相对于”设置为“模块内容根”并重新启动应用程序以清除任何其他源。