Gradle 4.0引入了多个sourceSet
s 每个 JVM 语言,以便启用远程构建缓存。随着java
插件你的build/classes/main
应该成为build/classes/java/main
and build/classes/test
应该成为build/classes/java/test
, etc.
您看到的警告定义在默认源集.java https://github.com/gradle/gradle/blob/bb0ed850aa4061931a62133091d66c56551cf5e0/subprojects/plugins/src/main/java/org/gradle/api/internal/tasks/DefaultSourceSetOutput.java#L79
因此,如果您的项目或您的项目中有任何插件build.gradle
calls DefaultSourceSetOutput.getClassesDir()
(或访问classesDir
)您会收到此警告。
解决方案1
Use
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 https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/SourceSetOutput.html#getClassesDir() marks getClassesDir()
已弃用。
因此,在项目中的所有插件都获得 Gradle 4.0 支持之前,您应该坚持使用解决方法并忽略弃用警告。
另一个问题是测试文件。如果您不想使用新布局 (build/classes/main
and build/classes/java/test
)你也应该调整测试路径:
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
UPDATEIDEA 的用户可能会注意到 IDE 开始使用单独的out
如果检测到 Gradle 4.x,则用于构建的目录。这使得不可能热应用重新加载如果您在 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 等)的模块。