Gradle 4.0 为每种 JVM 语言引入了多个 sourceSets,以启用远程构建缓存。使用java 插件,您的build/classes/main 应变为build/classes/java/main 和build/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/main 和 build/classes/java/test),您也应该调整测试路径:
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
更新
如果检测到 Gradle 4.x,IDEA 的用户可能会注意到 IDE 开始使用单独的 out 目录进行构建。如果您在 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 类路径可能会损坏。只需对使用 IDEA 内置构建命令(Ctrl+Shift+F10 等)的模块执行 gradle clean。