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

问题描述 投票:4回答:2

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

  1. 告诉intellij输出到与gradle相同的目录(如果intellij之外的进程更新build /下的文件,这可能会导致奇怪的行为)
  2. 告诉intellij使用gradle执行所有任务(我听说这比intellij的make慢)
  3. 告诉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

gradle intellij-idea lombok
2个回答
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忽略由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


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目录中生成源,覆盖彼此根据需要。还要确保“存储生成的源相对于”设置为“模块内容根”并重新启动应用程序以清除任何其他源。

© www.soinside.com 2019 - 2024. All rights reserved.