一尘不染

在Gradle中拆分所有输出目录

java

Gradle 4.0昨天发布了,我为此更新了我的项目。

现在,我收到以下警告:

Gradle现在为每种JVM语言使用单独的输出目录,但是此构建为源集中的所有类假定一个目录。此行为已被弃用,并计划在Gradle 5.0中删除。

我想为每种语言使用单独的输出目录。我需要进行哪些更改才能实现这一目标?


我尝试过的事情:

  • gradle clean 其次是 gradle build
  • 删除构建目录然后运行gradle build
  • 删除gradle和build目录,然后运行 gradle

相关的GitHub 问题


Gradle插件:

  • 爪哇
  • 理念
  • org.springframework.boot

阅读 304

收藏
2020-12-03

共1个答案

一尘不染

Gradle 4.0
sourceSet为每种JVM语言引入了多个s,以便启用远程构建缓存。使用该java插件,您build/classes/main应该成为build/classes/java/mainbuild/classes/test应该成为build/classes/java/test,等等。

您看到的警告在DefaultSourceSets.java中定义

因此,如果项目中有任何插件或您的build.gradle调用DefaultSourceSetOutput.getClassesDir()(或访问classesDir),您将收到此警告。

解决方案1

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")

对应于:

@Override
public boolean isLegacyLayout() {
    return classesDir!=null;
}

@Override
public void setClassesDir(File classesDir) {
    setClassesDir((Object)classesDir);
}

@Override
public void setClassesDir(Object classesDir) {
    this.classesDir = classesDir;
    this.classesDirs.setFrom(classesDir);
}

请注意,SourceSetOutput.java标记getClassesDir()为已弃用。

因此,在项目中的所有插件都获得对Gradle 4.0的支持之前,您应该坚持解决方法,并忽略弃用警告。

另一个问题是测试文件。 如果您不想使用新的布局
build/classes/mainbuild/classes/java/test),也应该调整测试路径:

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")

UPDATE IDEA的用户可能会注意到,out如果检测到Gradle 4.x
,IDE将开始使用单独的目录进行构建。如果您在IDEA之外运行应用程序,则无法 重新加载热应用 程序。要修复该添加和重新导入:

subprojects {
    apply plugin: 'idea'
    // Due to Gradle 4.x changes (separate output directories per JVM language)
    // Idea developers refuse to reuse Gradle classpath and use own 'out/' directory.
    // Revert to old behavior to allow Spring Devtool to work with using fast Idea compiler.
    // https://youtrack.jetbrains.com/issue/IDEA-175172
    // Alternatively use native Gradle builds or bootRun.addResources = true
    // To use this feature push Ctrl+Shift+F9 to recompile!
    // Be aware that Idea put resources into classes/ directory!!
    idea.module.inheritOutputDirs = false
    idea.module.outputDir = sourceSets.main.output.classesDir
    idea.module.testOutputDir = sourceSets.test.output.classesDir
}

请注意,IDEA将资源与.class文件放在同一目录中,因此您的Gradle类路径可能会损坏。只需gradle clean对使用IDEA内置构建命令(Ctrl + Shift + F10等)的模块进行操作。

2020-12-03