Gradle 7.1 现已发布
Gradle团队很兴奋地宣布Gradle 7.1。
这个版本修订了增量Java编译并使它更容易配置Groovy、Scala和Antlr源集在科特林DSL。
也有几个新折旧和微小的改进让Gradle更容易使用。
下载连接:点击进入快速下载
升级说明
通过更新您的包装器,切换您的构建以使用Gradle 7.1:
./gradlew wrapper --gradle-version=7.1
参见Gradle 7.x升级指南了解升级到Gradle 7.1时的弃用、重大变更和其他注意事项。
关于Java、Groovy、Kotlin和Android兼容性,请参见完全兼容性说明.
改进的Java增量编译
格雷尔有一个Java增量编译器默认情况下启用,通过只编译需要编译的Java源文件来加快增量编译。
Java增量编译器在这个版本中得到了实质性的改进。
增量编译分析现在存储在构建缓存中
在以前的Gradle版本中,增量编译分析只存储在本地。这意味着当编译任务的输出从构建缓存,后续的构建不能进行增量编译,总是需要完全重新编译。
在Gradle 7.1中,增量分析的结果现在存储在构建缓存中,从构建缓存中提取后的第一次编译将是增量的。
增量编译分析速度更快,使用的内存和磁盘空间更少
增量编译分析需要Gradle从类文件中提取符号,并分析依赖关系的传递图,以确定特定符号的使用者。这会消耗大量内存和时间。
Gradle 7.1显著降低了增量编译分析的成本,以及分析的规模。
这种变化的影响因项目而异,但非常明显。在Gradle项目本身上,我们能够以两倍的速度进行增量编译!
对常数的更改不再触发完全重新编译
最后,由于Java编译器的工作方式,以前的Gradle版本被迫在任何的上游依赖项中的常量已更改。
Gradle 7.1引入了一个编译器插件,该插件执行常量使用情况跟踪,并且只在常量改变时才重新编译常量的消费者。
这可以加速使用大量常量的项目的增量构建,这对于从模板引擎生成的代码来说是很常见的。
Kotlin DSL中更简单的源集配置
使用Kotlin DSL时,在为Java以外的语言配置源位置时,需要一个特殊的构造。例如,下面是您将如何配置groovy来源:
sourceSets {
main {
withConvention(GroovySourceSet::class) {
groovy {
setSrcDirs(listOf("src/groovy"))
}
}
}
}
Gradle 7.1在以下插件中为每种语言定义了源集的扩展:
- groovy
- antlr
- scala
这意味着Kotlin DSL可以访问自动生成的访问器和withConvention不再需要:
sourceSets {
main {
groovy {
setSrcDirs(listOf("src/groovy"))
}
}
}
为编译任务构建缓存友好的命令行参数
使用声明编译器守护程序的参数时jvmArgs,这些参数总是被视为String编译任务的输入。
有时,这些参数表示需要作为构建缓存键的一部分捕获的文件的路径。将这些参数建模为输入文件可以提高编译任务的增量,并避免不必要的缓存缺失。
以前,Java编译器调用的参数可以在编译器参数提供程序,但是对于编译器守护进程本身的命令行参数,没有办法做到这一点。现在,您可以为编译器守护程序提供命令行参数JavaCompile, GroovyCompile,以及ScalaCompile任务使用jvmArgumentProviders.
CommandLineArgumentProvider通过配置的对象jvmArgumentProviders将被询问输入和/或输出注释,Gradle将把这些添加到各自的任务中。
def javaAgent = objects.newInstance(JavaAgent)
javaAgent.jarFile = file('some/path/to/agent.jar')
// This can be done with Groovy, Java or Scala compilation
tasks.withType(GroovyCompile).configureEach {
groovyOptions.forkOptions.jvmArgumentProviders.add(javaAgent)
}
abstract class JavaAgent implements CommandLineArgumentProvider {
@Classpath
abstract RegularFileProperty getJarFile()
@Override
List<String> asArguments() {
def jarFilePath = jarFile.get().asFile.absolutePath
return ["-javaagent:${jarFilePath}".toString()]
}
}
JaCoCo插件支持Java 15/16
JaCoCo插件已升级到最新版本JaCoCo版本0.8.7其中包括对Java 15和16的支持以及对Java 17的实验性支持。
已修复问题
在Gradle 7.1中修复了46个问题。
[#17359] -构建扫描插件在Gradle 7.1-rc-1的Elasticsearch构建中停止工作
[#17319] -将Gradle 7.1-rc-1项目导入IDEA时出现例外“多个构建器可用于构建模型”
[#17252] -添加/usr/lib64/jvm作为Linux工具链位置
[#17217] -启用配置缓存时,无法发送构建扫描
[#17195] -应该果断地选择Java 9之前的工具链
[#17130] -文档:snipped使用了不正确的验证错误抑制id
[#17085] -在JavaInstallationMetadata中提供详细的工具信息
[#17049] -使用第三方插件跟进Report.enabled弃用
[#17048] -跟进javaexechandlebuilder . setmain(String)弃用第三方插件
[#17047] -使用第三方插件跟进WorkerExecutor.submit()弃用
[#16985] -持久化的工作输出应该精确地记录执行工作所花费的原始执行时间
[#16974] -反对消耗代码质量+ antlr插件配置
[#16939] -使JacocoCoverageVerification可缓存
[#16806] -增量编译器更改后的性能回归
[#16784] -允许迭代版本目录中声明的依赖项
[#16775] -在7.0中使用“Provider#orElse”会导致“查询属性的映射值”…任务前…不支持已完成”错误
[#16743] -控制台上的构建结束摘要应报告包含的构建中的任务
[#16402] -不推荐描述构建布局的命令行选项
[#16398] -使用新的并行TAPI API时,模型构建挂起
[#16255] -避免显示某些验证反对警告的类型
[#16180] -配置缓存无法恢复URL类型的属性
[#15983] -确保跟进冒烟测试中的弃用警告
[#15825] -"任务"任务与配置缓存不兼容
[#15681] -从7.0开始,不推荐使用具有稳定属性的getter/setter作为替代
[#15679] - CreateOutputsStep在FileTree上输出文件批注时尝试对现有文件调用mkdirs
[#15638] -反对“上传”任务
[#15569] - zipTree不传播任务相关性
[#15416] -确保预编译设置脚本插件- Kotlin DSL和Groovy DSL支持“插件{}”和“插件管理{}”块
[#15404] -包含预编译Kotlin DSL插件的构建在某些情况下无法导入到IDEA中
[#15378] -在设置构建脚本中使用failOnVersionConflict解决策略会导致NullPointerException
[#15214] -kot Lin预编译脚本插件的访问器生成任务会产生和存储有问题的输出
[#14107] - DependencySubstitutions API进化(不赞成“Substitution.with”)
[#13891] -不赞成包含根项目目录之外的子项目
[#13122] -"尚未加载GradleProperties "错误,当使用ProjectBuilder构建项目时
[#12767] -弃用“JacocoMerge”任务
[#11621] -使反对警告更加清晰
[#10796] -完全不赞成上传任务和相关概念
[#10061] -弃用旧工件转换API
[#9804] -对Groovy增量编译源类映射使用不同的存储方法
[#9052] -从增量Java编译器中删除自定义变更检测代码
[#8404] -对“Provider”类型的属性使用(内部)约定映射进行弃用
[#6825] -使用intellij项目导入时,无法从初始化脚本中读取gradle.properties中的系统属性
[#4884] -提供公共升级API
[#3425] -反对`公约’概念
[#3191] -公开静态类型的方法从源集中获取约定
[#1001] -buildSrc的Init脚本应该能够访问gradle.properties