拆分Gradle中的所有输出目录

sha*_*cer 30 java gradle build.gradle

Gradle 4.0昨天问世了,我为它更新了我的项目.

现在我收到以下警告:

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

我想为每种语言使用单独的输出目录.为了实现这一目标,我需要做些什么改变?


我试过的事情:

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

相关的GitHub 问题


Gradle插件:

  • java的
  • 日食
  • 理念
  • org.springframework.boot

gav*_*koa 15

Gradle 4.0为每个JVM语言引入了多个sourceSet,以便启用远程构建缓存.随着sourceSet插件你java应该成为build/classes/main,build/classes/java/main应该成为build/classes/test,等等.

该警告定义如下:

https://github.com/gradle/gradle/blob/bb0ed850aa4061931a62133091d66c56551cf5e0/subprojects/plugins/src/main/java/org/gradle/api/internal/tasks/DefaultSourceSetOutput.java#L79

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
Run Code Online (Sandbox Code Playgroud)

因此,如果您的项目或build/classes/java/test通话中的任何插件,您build.gradle会收到此警告.

正式推荐的摆脱这种警告的方法是:

@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);
}
Run Code Online (Sandbox Code Playgroud)

对应于:

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
Run Code Online (Sandbox Code Playgroud)

请注意,https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/SourceSetOutput.html#getClassesDir()标记DefaultSourceSetOutput.getClassesDir() 为已弃用.

因此,在项目中所有使用过的插件都获得对Gradle 4.0的支持之前,您应该坚持使用变通方法并忽略Gradle源代码构建脚本中的弃用.

另一个问题是测试文件.如果您不喜欢具有不同的层次结构布局(classesDirgetClassesDir()),您也应该调整测试路径:

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
}
Run Code Online (Sandbox Code Playgroud)

更新 IDEA的用户可能会注意到IDE开始使用单独的build/classes/main目录来构建它检测到Gradle 4.x. 如果您在IDEA之外运行应用程序,这将导致无法重新加载应用程序.要修复添加和重新导入:

sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
Run Code Online (Sandbox Code Playgroud)

请注意,IDEA将资源放在与build/classes/java/test文件相同的目录中,这样您的Gradle类路径就会被破坏.只out针对使用IDEA内置构建命令的模块(Ctrl + Shift + F10等).

  • 我们已经出于其他原因使用了setClassesDir,但无论如何我们都会收到警告.我实际上试图删除我们的调用,认为这可能是警告的原因,哈哈. (3认同)
  • @Trejkaz原因是`setClassesDir`现在产生完全相同的警告:https://github.com/gradle/gradle/blob/c684c202534c4138b51033b52d871939b8d38d72/subprojects/plugins/src/main/java/org/gradle/api/internal/任务/ DefaultSourceSetOutput.java#L95 (2认同)

小智 5

这是由于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