百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Gradle 5.0来了,你还在用4.X吗?

bigegpt 2024-09-11 01:12 11 浏览


本文翻译自官网 :https://gradle.org/whats-new/gradle-5/

Gradle 5.0是最快、最安全、功能最强的Gradle版本。

改进的增量编译和增量注释处理建立在坚实的性能基础之上,这些性能基础已经提供了构建缓存和最新的检查功能。

依赖约束、依赖对齐和版本锁定提供了可伸缩和灵活的依赖管理模型。

通过新的性能、依赖管理、日志记录和废弃的API使用检查,构建扫描有了显著的改进。

我们将最近版本中的主要改进分为以下几类:

  • 更快的构建
  • 细粒度的传递依赖关系管理
  • 编写Gradle构建逻辑
  • 更高效的内存级别执行
  • 新的Gradle调用选项
  • 新的Gradle任务和插件api

在文章末尾,您可以进一步了解如何升级到5.0。

更快的构建

缓慢的构建会浪费很多钱。通过使用Gradle 5.0中的新构建缓存和增量处理特性,只构建你需要的东西,

你和你的主管都会很高兴。

在升级到Gradle 5.0之后,你的构建已经快了一些,你可以通过使用和配置本节中描述的其他特性来进一步提高它们的性能。



1.Build caching

通过重用以前执行的结果来避免工作,这使得Gradle非常快。Gradle 4.0引入了构建缓存,其目的是重用以前调用Gradle时的输出。

今天,用于Android、Kotlin、c++、Scala和许多其他插件的插件使得任务可以缓存,因此可以跨不同的机器重用。有效地使用构建缓存可以将构建时间减少90%。

此外,Gradle 5.0中的构建缓存在更多的场景中也是启用的,例如当一个任务声明一个@ outputdirectory或@OutputFiles集合时。

2.增量Java编译

在Gradle 5.0中,增量编译器是高度优化的,并且是默认开启的。

这是一个非常棒的消息,因为编译java任务不需要重新编译所有的源文件,除非你clean了项目后的第一次编译。

3.增量注解处理

5.0中的增量编译器支持增量注解处理,当有注解处理程序时,显著提高了增量编译的效率。这是一个重要的创新,因为依赖注解处理器的项目越来越多。

要利用增量注解处理,请确保升级到选择该特性的注解处理程序版本。您可以通过--info日志记录或在这个流行的注释处理程序表中发现给定的注释过程是否是增量的。

https://github.com/gradle/gradle/issues/5277

使用新的annotationProcessor配置可以方便地管理注释处理器,并将它们放到注释处理器路径上。

4.构建扫描

通过对性能、依赖管理、日志记录和废弃api的使用进行新的检查,构建扫描有了显著的改进。这是一个免费的服务,提供给Gradle用户-只需添加--scan时,在命令行上执行Gradle或应用和配置构建扫描插件。

细粒度的传递依赖关系管理

Gradle 5.0提供了几个新的特性来定制如何选择依赖项,以及改进的POM和BOM支持:

  • 依赖约束允许您定义版本或版本范围来限制直接和传递依赖版本(Maven不支持)。
  • 平台定义(又称Maven BOM依赖项)是本地支持的,它允许在不使用外部插件的情况下导入Spring引导平台定义之类的东西。
  • 依赖项对齐允许逻辑组中的不同模块(例如Jackson模块)对齐到相同的版本。
  • 现在可以锁定动态依赖项版本,以便更好地构建可重现性。

1.依赖约束

依赖约束提供了对传递依赖项的可靠控制。已声明的约束列在改进的依赖关系洞察报告和构建扫描中。

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'
 }
 }
}

2.BOM的支持

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构建生成的依赖项时提供了更无缝的体验。

  • 在使用POM文件时,Gradle将正确地分离编译和运行时范围。这避免了由于以前在编译类路径中包含运行时依赖项而导致的性能下降和依赖项泄漏。
  • 支持在POM文件的
  • 标签中定义版本范围
 <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>

3.依赖对齐

依赖项版本对齐允许属于同一逻辑组(平台)的不同模块在依赖项图中拥有相同的版本。

这解决了确保所有Spring或Hibernate依赖项具有相同版本(如果适用)的问题。事实上,有许多库是以集合的形式发布的,集合中的每个库具有相同的版本。这个特性还有其他用例,所以请按照上面的链接从文档了解更多信息。

4.依赖版本锁定

您可以使用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()
 }
}

编写Gradle构建逻辑

现在可以用Kotlin编写Gradle构建脚本。此外,gradle init还扩展了项目类型和交互性。

1.Kotlin DSL支持

Kotlin DSL 1.0从Gradle 5.0开始就可以使用了。Kotlin中的静态类型允许工具提供更好的IDE帮助,包括调试和重构构建脚本、自动完成、错误提示和您期望的其他一切。

2.扩展和交互式 gradle init

希望创建新Gradle构建的用户可以选择其他项目类型:kotlin-library和kotlin-application。此外,您可以选择生成Groovy或Kotlin DSL构建脚本,并自定义项目名称和包。最后,一个新的交互UI让用户体验特别愉快。

3.更加可导航和面向用例的文档

更高效的内存级别执行

像--fail--fast和JVM应用程序的命令行参数等特性允许更好的开发工作流,同时降低内存需求和缓存清理可以减少Gradle在系统上的开销。

1.降低内存需求

升级不仅会使构建速度更快,而且还会大大减少内存的使用。许多缓存机制在Gradle 5.0中得到了优化,结果Gradle进程的默认最大内存大大减少。

Process TypeGradle 4.x Gradle 5.0 Command-line client1 GB64 MBGradle Daemon1 GB512 MBWorker processes1/4 of physical memory512 MB

2.阶段性缓存清理

手动清理Gradle缓存的日子已经结束了。Gradle现在定期清理过期缓存。Gradle还更精确地跟踪陈旧的任务输出,并且能判断出如果当前不清理可能会造成错误,进而自动进行清理。

新的Gradle调用选项

1.Testing

Gradle 5.0包括对JUnit 5的支持:JUnit平台、JUnit Jupiter和JUnit Vintage。这种支持允许您启用测试分组和筛选,并包括定制的测试引擎。

test {
 useJUnitPlatform {
 excludeTags 'slow'
 includeEngines 'junit-vintage'
 failFast = true
 }
}

2.Logging

在Gradle 5.0中,日志消息现在按照为非交互环境(如持续集成执行)生成日志消息的任务分组。

除了显示正在执行哪些测试之外,Gradle丰富的命令行控制台还显示了一个彩色的构建状态,可以一眼看出是否有任何测试失败。您还可以要求Gradle在任务使用“详细”控制台模式执行时记录它们。

最后,通过配置警告模式,可以汇总、屏蔽或扩展Gradle警告日志。这对于将您的构建升级到5.0级非常有帮助。

3.复合构建

复合构建允许您包含其他独立项目,例如,您可以同时开发应用程序和依赖的库。

现在可以使用构建扫描检查复合构建。复合构建还与--continuous兼容。

默认情况下它们是并行构建的,现在可以嵌套了。

4.JVM应用程序的命令行参数

使用Gradle 5.0运行带有自定义参数的Java应用程序要容易得多,因为您可以在命令行上或通过IDE简单地指定它们。

新的Gradle任务和插件api

Gradle 5.0提供了许多新的api,这些api支持更快、更通用的构建逻辑。

1.Performance APIs

新的Worker API允许安全的并行和异步执行。按照我们的指南,使用Worker API为自定义任务启用更快的构建。


2.Improved task I/O

正确声明输入和输出对于正确的增量构建和构建缓存行为至关重要。Gradle 5.0加强了约束,并为输入/输出声明引入了新的api,这些api可以帮助您避免正确性问题。



3.避免多余配置

有些项目会产生很多很多的任务。当只执行一些操作时,配置所有这些操作是没有意义的。这就是Gradle 5.0的新配置避免api的帮助之处。通过在自定义任务中采用这些配置,大型项目可以节省高达10%的配置时间。



4.发布 APIs

Gradle 5.0引入了新的api来改进对Maven和Ivy存储库的发布:

  • 签名插件支持对发布的所有产物签名。
  • 发布了配置范围内的依赖项排除。
  • Maven发布和Ivy发布插件提供类型安全的dsl来定制作为发布的一部分生成的pom或Ivy模块。

5.Task timeouts

现在可以为任务指定超时时间,超时后任务将被中断。

task hangingTask() {
 doLast {
 Thread.sleep(100000)
 }
 timeout = Duration.ofMillis(500)
}

6.自定义CLI 参数

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
 }
}

7.定制嵌套dsl

为需要使用内部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 升级到4.10.2 gradle wrapper --gradle-version=4.10.2
  • 运行gradle help --scan列出所有不推荐使用的gradle api及其位置,包括插件
  • 更新你的Gradle插件,特别是那些在构建扫描的警告报告中列出的插件
  • 升级到JDK 8或更高版本

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...