重复生成的类gradle输出(build / ...)与intellij输出(out / ...)

时间:2019-04-25 18:39:53

标签: gradle intellij-idea lombok

我正在将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和自动生成的源一起使用的最佳实践是什么?你:

  1. tell intellij输出到gradle所在的目录(此目录 如果intellij以外的进程更新,可能会导致异常行为 build /)下的文件
  2. 告诉intellij使用以下命令执行所有任务 gradle(我听说这比intellij的制作要慢) tell intellij 只是忽略“ build”目录(您甚至如何做到这一点? 为什么intellij知道输出时甚至关心'build /' 到'out /')

更新:为了澄清这种情况,问题不在于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 /目录中看到生成的源代码。

generated sources root

annotation processor settings

gradle settings

gradle runner settings

3 个答案:

答案 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

最后,您清理并重新构建。问题将得到解决。