Gradle 5.0 新特性介绍

本文翻译自官网 :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 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

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为自定义任务启用更快的构建。

没有使用 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或更高版本

本文分享自微信公众号 - Android每日一讲(gh_f053f29083b9)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 14.04上导入和导出OrientDB数据库

OrientDB是一个多模型NoSQL数据库,支持图形和文档数据库。它是一个Java应用程序,可以在任何操作系统上运行。它也完全支持ACID,支持多主复制。它由...

17600
来自专栏友弟技术工作室

IPFS星际文件系统之-- 环境配置

IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,它整合了过去几年最好的分布式系统思路,为所有人提供全球统一的...

26340
来自专栏Web项目聚集地

从零学习Spring MVC框架「运行流程及静态资源处理」

第一篇文章「从零学习Spring MVC框架「环境搭建和MVC架构」」中我们初步进行了环境搭建,对Spring MVC框架的运行原理有个大体了解,为了帮助大家理...

10510
来自专栏云计算教程系列

如何在Ubuntu上安装Jenkins

Jenkins是一个开源自动化服务器,旨在自动执行持续集成和交付软件所涉及的重复技术任务。Jenkins是基于Java开发,可以从Ubuntu软件包安装,也可以...

25510
来自专栏Web 开发

愉快的和Gist玩耍

WordPress有一个Gist的embed插件,但是这个插件是直接引入Gist的script,这个script是通过document.write()阻塞方式,...

12400
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(中)

抱歉来晚了!由于最近事比较多,拖了一段时间,答案本想自己写的,但是时间不允许,挤时间整理了部分答案,后面我会继续更新,谢谢关注。 51.servlet生命周期及...

33660
来自专栏zhisheng

Java研发方向如何准备BAT技术面试答案(中)

JavaEE: 1.servlet生命周期及各个方法 参考文章 http://www.cnblogs.com/xuekyo/archive/2013/02/2...

440130
来自专栏非著名程序员

将Eclipse中的项目迁移到Android Studio中的方法

将Eclipse中的项目迁移到Android Studio中 非著名程序员 我们都知道Google官网在年底将不再支持Eclipse的开发,我也相信现在肯定还有...

20760
来自专栏Jerry的SAP技术分享

在云环境上使用SLF4J对Java程序进行日志记录

我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助。

11220
来自专栏惨绿少年

memcached 缓存数据库应用实践

1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存       缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付...

48000

扫码关注云+社区

领取腾讯云代金券