拆分 Gradle 中的所有输出目录

2022-09-01 10:03:15

Gradle 4.0昨天问世,我更新了我的项目。

现在我收到以下警告:

Gradle 现在对每门 JVM 语言使用单独的输出目录,但此版本假定源代码集中的所有类都有一个目录。此行为已被弃用,并计划在 Gradle 5.0 中删除

我想为每种语言使用单独的输出目录。我需要改变什么才能实现这一目标?


我尝试过的事情:

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

相关的 GitHub 问题


Gradle 插件:

  • 爪哇岛
  • 日蚀
  • 想法
  • org.springframework.boot

答案 1

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

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

因此,如果您的项目或调用(或访问)中的任何插件,您会收到此警告。build.gradleDefaultSourceSetOutput.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")

更新IDEA 的用户可能会注意到,如果检测到 Gradle 4.x,IDE 开始使用单独的目录进行构建。这使得如果你在IDEA之外运行应用程序,则不可能重新加载热应用程序。要修复添加和重新导入的问题,请执行以下操作:out

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 将资源放入与文件相同的目录中,因此您的 Gradle 类路径可能会损坏。只需对使用 IDEA 内置构建命令(Ctrl+Shift+F10 等)的模块执行操作即可。.classgradle clean


答案 2

这是由于 Gradle 4.0 中引入的更改:如果有多个语言源,它现在使用单独的输出目录。

要返回到旧行为并摆脱警告,请将以下内容插入到 build.gradle 中:

// Change the output directory for the main source set back to the old path sourceSets.main.output.classesDir = new File(buildDir, "classes/main")

参考资料: https://docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set


推荐