本文翻译自官网 :https://gradle.org/whats-new/gradle-5/
Gradle 5.0是最快、最安全、功能最强的Gradle版本。
改进的增量编译和增量注释处理建立在坚实的性能基础之上,这些性能基础已经提供了构建缓存和最新的检查功能。 依赖约束、依赖对齐和版本锁定提供了可伸缩和灵活的依赖管理模型。 通过新的性能、依赖管理、日志记录和废弃的API使用检查,构建扫描有了显著的改进。
我们将最近版本中的主要改进分为以下几类:
在文章末尾,您可以进一步了解如何升级到5.0。
缓慢的构建会浪费很多钱。通过使用Gradle 5.0中的新构建缓存和增量处理特性,只构建你需要的东西, 你和你的主管都会很高兴。 在升级到Gradle 5.0之后,你的构建已经快了一些,你可以通过使用和配置本节中描述的其他特性来进一步提高它们的性能。
通过重用以前执行的结果来避免工作,这使得Gradle非常快。Gradle 4.0引入了构建缓存,其目的是重用以前调用Gradle时的输出。
今天,用于Android、Kotlin、c++、Scala和许多其他插件的插件使得任务可以缓存,因此可以跨不同的机器重用。有效地使用构建缓存可以将构建时间减少90%。
此外,Gradle 5.0中的构建缓存在更多的场景中也是启用的,例如当一个任务声明一个@ outputdirectory
或@OutputFiles
集合时。
在Gradle 5.0中,增量编译器是高度优化的,并且是默认开启的。
这是一个非常棒的消息,因为编译java任务不需要重新编译所有的源文件,除非你clean了项目后的第一次编译。
5.0中的增量编译器支持增量注解处理,当有注解处理程序时,显著提高了增量编译的效率。这是一个重要的创新,因为依赖注解处理器的项目越来越多。
要利用增量注解处理,请确保升级到选择该特性的注解处理程序版本。您可以通过--info
日志记录或在这个流行的注释处理程序表中发现给定的注释过程是否是增量的。
https://github.com/gradle/gradle/issues/5277
使用新的annotationProcessor配置可以方便地管理注释处理器,并将它们放到注释处理器路径上。
通过对性能、依赖管理、日志记录和废弃api的使用进行新的检查,构建扫描有了显著的改进。这是一个免费的服务,提供给Gradle用户-只需添加--scan
时,在命令行上执行Gradle或应用和配置构建扫描插件。
Gradle 5.0提供了几个新的特性来定制如何选择依赖项,以及改进的POM和BOM支持:
依赖约束提供了对传递依赖项的可靠控制。已声明的约束列在改进的依赖关系洞察报告和构建扫描中。
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because 'previous versions have a bug impacting this application'
}
implementation('commons-codec:commons-codec:1.11') {
because 'version 1.9 pulled from httpclient has bugs affecting this application'
}
}
}
Gradle 5.0可导入资源(BOM)文件。
dependencies {
// import a BOM
implementation platform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE')
// define dependencies without versions
implementation 'com.google.code.gson:gson'
implementation 'dom4j:dom4j'
}
此外,Gradle 5.0在使用Maven构建生成的依赖项时提供了更无缝的体验。
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>[3.0,4.0)</version>
</parent>
<groupId>org.apache.maven.its.mng2199</groupId>
<artifactId>valid</artifactId>
<version>1</version>
<packaging>pom</packaging>
</project>
依赖项版本对齐允许属于同一逻辑组(平台)的不同模块在依赖项图中拥有相同的版本。
这解决了确保所有Spring或Hibernate依赖项具有相同版本(如果适用)的问题。事实上,有许多库是以集合的形式发布的,集合中的每个库具有相同的版本。这个特性还有其他用例,所以请按照上面的链接从文档了解更多信息。
您可以使用Gradle 5.0将动态或远程依赖项锁定到特定的版本,从而使依赖项解析更加确定和可重现。这可以防止转换依赖项的更改意外地破坏构建。
Example 1,锁定特定cofiguration
#build.gradle
configurations {
compileClasspath {
resolutionStrategy.activateDependencyLocking()
}
}
Example 2,锁定所有configuration
#build.gradle
dependencyLocking {
lockAllConfigurations()
}
Example 3, 锁定buildscript classpath configuration
#build.gradle
buildscript {
configurations.classpath {
resolutionStrategy.activateDependencyLocking()
}
}
现在可以用Kotlin编写Gradle构建脚本。此外,gradle init还扩展了项目类型和交互性。
Kotlin DSL 1.0从Gradle 5.0开始就可以使用了。Kotlin中的静态类型允许工具提供更好的IDE帮助,包括调试和重构构建脚本、自动完成、错误提示和您期望的其他一切。
希望创建新Gradle构建的用户可以选择其他项目类型:kotlin-library和kotlin-application。此外,您可以选择生成Groovy或Kotlin DSL构建脚本,并自定义项目名称和包。最后,一个新的交互UI让用户体验特别愉快。
像--fail--fast
和JVM应用程序的命令行参数等特性允许更好的开发工作流,同时降低内存需求和缓存清理可以减少Gradle在系统上的开销。
升级不仅会使构建速度更快,而且还会大大减少内存的使用。许多缓存机制在Gradle 5.0中得到了优化,结果Gradle进程的默认最大内存大大减少。
Process Type | Gradle 4.x | Gradle 5.0 |
---|---|---|
Command-line client | 1 GB | 64 MB |
Gradle Daemon | 1 GB | 512 MB |
Worker processes | 1/4 of physical memory | 512 MB |
手动清理Gradle缓存的日子已经结束了。Gradle现在定期清理过期缓存。Gradle还更精确地跟踪陈旧的任务输出,并且能判断出如果当前不清理可能会造成错误,进而自动进行清理。
Gradle 5.0包括对JUnit 5的支持:JUnit平台、JUnit Jupiter和JUnit Vintage。这种支持允许您启用测试分组和筛选,并包括定制的测试引擎。
test {
useJUnitPlatform {
excludeTags 'slow'
includeEngines 'junit-vintage'
failFast = true
}
}
在Gradle 5.0中,日志消息现在按照为非交互环境(如持续集成执行)生成日志消息的任务分组。
除了显示正在执行哪些测试之外,Gradle丰富的命令行控制台还显示了一个彩色的构建状态,可以一眼看出是否有任何测试失败。您还可以要求Gradle在任务使用“详细”控制台模式执行时记录它们。
最后,通过配置警告模式,可以汇总、屏蔽或扩展Gradle警告日志。这对于将您的构建升级到5.0级非常有帮助。
复合构建允许您包含其他独立项目,例如,您可以同时开发应用程序和依赖的库。
现在可以使用构建扫描检查复合构建。复合构建还与--continuous
兼容。
默认情况下它们是并行构建的,现在可以嵌套了。
使用Gradle 5.0运行带有自定义参数的Java应用程序要容易得多,因为您可以在命令行上或通过IDE简单地指定它们。
Gradle 5.0提供了许多新的api,这些api支持更快、更通用的构建逻辑。
新的Worker API允许安全的并行和异步执行。按照我们的指南,使用Worker API为自定义任务启用更快的构建。
没有使用 Worker API 使用 Worker API
正确声明输入和输出对于正确的增量构建和构建缓存行为至关重要。Gradle 5.0加强了约束,并为输入/输出声明引入了新的api,这些api可以帮助您避免正确性问题。
有些项目会产生很多很多的任务。当只执行一些操作时,配置所有这些操作是没有意义的。这就是Gradle 5.0的新配置避免api的帮助之处。通过在自定义任务中采用这些配置,大型项目可以节省高达10%的配置时间。
Gradle 5.0引入了新的api来改进对Maven和Ivy存储库的发布:
现在可以为任务指定超时时间,超时后任务将被中断。
task hangingTask() {
doLast {
Thread.sleep(100000)
}
timeout = Duration.ofMillis(500)
}
Gradle 5.0提供了允许用户配置自定义任务的新方法。
首先,您可以使用@Option
创建自定义命令行选项。用户可以通过执行gradle help——task your-task
来发现这些问题:
public class UrlVerify extends DefaultTask {
private String url;
@Option(option = "url", description = "Configures the URL to be verified.")
public void setUrl(String url) {
this.url = url;
}
@Input
public String getUrl() {
return url;
}
@TaskAction
public void verify() {
getLogger().quiet("Verifying URL '{}'", url);
// verify URL by making a HTTP call
}
}
为需要使用内部api的任务提供自定义的嵌套DSL。Gradle 5.0为嵌套DSL元素提供了一流的api,在考虑用户如何配置任务时提供了更大的灵活性。
Gradle 5.0为计算(或延迟)任务输入和输出提供了额外的API便利。这使得自定义任务作者能够将Gradle models连接在一起,而不用担心给定的属性值何时会被知道,也不用担心在任务配置期间会避免资源密集型工作。
请参考如何从Gradle 4.x升级到 Gradle 5.0: https://docs.gradle.org/5.0/userguide/upgrading_version_4.html 在升级之前,我们建议你:
gradle wrapper --gradle-version=4.10.2
gradle help --scan
列出所有不推荐使用的gradle api及其位置,包括插件