Gradle 4.0昨天问世了,我为它更新了我的项目。
现在我收到以下警告:
Gradle现在为每种JVM语言使用单独的输出目录,但是此构建假定源集中的所有类都有一个目录。此行为已被弃用,并计划在Gradle 5.0中删除
我想为每种语言使用单独的输出目录。为了实现这一目标,我需要做些什么改变?
我试过的事情:
gradle clean
紧随其后的是gradle build
gradle build
。gradle
相关GitHub issue
Gradle插件:
Gradle 4.0为每个JVM语言引入了多个sourceSet
s,以便启用远程构建缓存。随着java
插件你的build/classes/main
应该成为build/classes/java/main
和build/classes/test
应该成为build/classes/java/test
等。
您看到的警告在DefaultSourceSets.java中定义
因此,如果项目中的任何插件或build.gradle
调用DefaultSourceSetOutput.getClassesDir()
(或访问classesDir
),您会收到此警告。
使用
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")
更新IDEA的用户可能会注意到,如果检测到Gradle 4.x,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
。
这是由于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
我的情况有点具体,因为输出类目录用于构造命令行执行的类路径条目。但也许这会对某人有所帮助。
我决定连接所有输出目录。我所做的改变是形式
sourceSets.integrationTest.output.classesDir
至
ext {
classpathSeparator = System.properties['os.name'].toLowerCase().contains('windows')?";":":"
}
...
sourceSets.integrationTest.output.classesDirs.join(classpathSeparator)
例如,如果混合Java,Kotlin和Groovy项目结构应如下所示:
root/
src/
main/
java/
kotlin/
groovy/
test/
java/
kotlin/
groovy/
在build.gradle中,您必须指定特定语言所需的插件。
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'kotlin'