
本文共 2408 字,大约阅读时间需要 8 分钟。
Gradle 4.0为每个JVM语言引入了多个sourceSet,以便启用远程构建缓存 . 使用 java 插件, build/classes/main 应该变成 build/classes/java/main , build/classes/test 应该变成 build/classes/java/test 等 .
该警告定义如下:
@Override
public File getClassesDir() {
if (isLegacyLayout()) {
return fileResolver.resolve(classesDir);
}
SingleMessageLogger.nagUserOfDeprecatedBehaviour("Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set");
Object firstClassesDir = CollectionUtils.findFirst(classesDirs.getFrom(), Specs.SATISFIES_ALL);
if (firstClassesDir!=null) {
return fileResolver.resolve(firstClassesDir);
}
return null;
}
因此,如果项目中的任何插件或 build.gradle 调用 DefaultSourceSetOutput.getClassesDir() ,您会收到此警告 .
Officially recommended way to get rid of this warning is :
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);
}
因此,在项目中所有使用过的插件都获得对Gradle 4.0的支持之前,您应该坚持使用变通方法并忽略Gradle源代码构建脚本中的弃用 .
另一个问题是测试文件 . If you don't like to have different hierarchy layout ( 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")
UPDATE IDEA的用户可能会注意到IDE开始使用单独的 out 目录来构建它检测到的Gradle 4.x.如果您在IDEA之外运行应用程序,那么这将无法实现 hot app reloading . 要修复添加和重新导入:
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 .
发表评论
最新留言
关于作者
