gradle-6.8.1-all 百度网盘下载csdn免积分下载

一、Gradle 6.8.1 介绍与下载

Gradle 6.8.1 版本大大提高了 Kotlin DSL 构建脚本编译的性能,对 Java 工具链支持进行了一些改进,包括供应商选择,并使得直接从命令行执行复合构建中的任何任务变得容易。此版本还引入了新的依赖项管理 API,以实现一致性的解析。

下载连接:点击进入快速下载


二、性能提升

Kotlin DSL脚本编译改进

此版本使Gradle Kotlin DSL脚本(*.gradle.kts)的编译速度更快,减少了内存消耗,并引入了避免编译的功能,从而完全不需要重新编译Kotlin构建脚本。

在具有100个子项目的示例构建中,使用冷缓存和冷守护程序时,累积脚本编译时间从〜50秒降低到〜21秒。垃圾收集时间从2.6秒减少到1.3秒。此改进还减少了内存压力。最重要的是,非ABI更改现在可以完全消除构建脚本的重新编译,从而节省了21秒的时间。

在这里插入图片描述
到目前为止,buildSrc中对构建逻辑的任何更改都需要重新编译所有构建脚本。此版本引入了避免Gradle Kotlin DSL脚本的编译。

当对共享构建逻辑的更改影响构建脚本的类路径的ABI(应用程序二进制接口)时,避免编译将导致Gradle仅重新编译构建脚本。对构建逻辑的私有实现详细信息的更改,例如私有方法或类,非私有方法或类的主体,以及对预编译脚本插件的内部更改,将不再触发对项目构建脚本的重新编译。

避免编译也适用于构建脚本的类路径上任何JAR的更改。其中包括插件定义的插件添加的JAR,以及直接通过该buildscript {}块添加的JAR 。

尽管对您的构建的影响可能会有所不同,但是大多数构建在编辑Kotlin DSL构建逻辑时可以预期到反馈循环会明显缩短。

注意:避免编译不支持Kotlin的公共内联函数。如果此类函数出现在构建脚本的类路径上的JAR的公共API中,则对该JAR中的类进行更改将导致Gradle退回到其旧行为。例如,如果buildSrc包含一个带有公共内联函数的类,则对该类的任何更改buildSrc都将导致重新编译所有构建脚本。

具有运行时类路径的任务获得更多的缓存命中

对于最新检查和构建缓存,Gradle需要确定两个任务输入属性是否具有相同的值。为此,Gradle首先将两个输入标准化,然后比较结果。

现在,运行时类路径分析可以智能地检查所有属性文件,而忽略注释,空格和属性顺序差异的更改。此外,您可以有选择地忽略不影响运行时类路径的属性。

normalization {
    
    
    properties('**/build-info.properties') {
    
    
        ignoreProperty('timestamp')
    }
}

当类路径上的属性文件被重新生成或仅因不重要的值而不同时,这会提高最新和构建高速缓存命中的可能性。

存在空目录时,更多的缓存命中

对于最新的检查和构建缓存,Gradle需要确定两个目录结构是否包含相同的内容。当目录包含一个空目录时,该目录的内容与不存在该空目录的相同目录的内容不同。

这可能并不总是令人满意的。在许多情况下,仅目录结构中的文件可能很重要,并且空目录不会对任务的输出产生影响。在这种情况下,由于存在空目录而无需重新执行任务,因为它只会产生相同的输出。

引入了新的注释来解决这种情况。用@InputFiles或@InputDirectory注释的输入还可以用@IgnoreEmptyDirectories注释,以指定在构建缓存和最新检查期间不应考虑目录。对于以这种方式注释的输入,仅对文件(包括文件路径)的更改将被视为输入值中的差异。

class MyTask extends DefaultTask {
    
    
    @InputFiles
    @PathSensitive(@PathSensitivity.RELATIVE)
    @IgnoreEmptyDirectories
    FileCollection inputFiles;
}

同样,有一个对应的运行时API等效项:

tasks.register("myTask") {
    
    
    ext.inputFiles = files()
    inputs.files(inputFiles)
          .withPropertyName('inputFiles')
          .withPathSensitivity(PathSensitivity.RELATIVE)
          .ignoreEmptyDirectories()
}

SourceTask,JavaCompile,GroovyCompile和AntlrTask已全部更新,现在可以在进行最新检查和构建缓存键计算时忽略空目录。

配置缓存改进

该配置缓存通过缓存配置阶段的结果提高了构建性能。使用配置缓存,当没有任何影响构建配置的变化发生时,Gradle可以完全跳过配置阶段。

了解此功能及其对Gradle博客的影响。您还可以跟踪核心插件和社区插件中配置缓存支持的进度。

支持复合构建

从此版本开始,配置缓存完全支持复合构建。

更多受支持的核心插件
在此版本中,所有核心代码分析插件都完全支持配置缓存:

  1. checkstyle
  2. pmd
  3. codenarc
  4. jacoco

三、Java工具链改进

Java工具链支持提供了一种简便的方法来声明应使用哪个Java版本构建项目。默认情况下,Gradle将自动检测可用作工具链的已安装JDK。

在此版本中,工具链支持已添加到Groovy编译任务中,并进行了以下改进。

按供应商和实施选择工具链

如果您的构建对使用的JRE / JDK有特定要求,则可能还需要为工具链定义供应商。JvmVendorSpec列出了Gradle认可的知名JVM供应商。

java {
    
    
    toolchain {
    
    
        languageVersion = JavaLanguageVersion.of(11)
        vendor = JvmVendorSpec.ADOPTOPENJDK

        // alternativly, use custom matching
        // vendor = JvmVendorSpec.matching("customString")
    }
}

如果供应商不足以选择适当的工具链,则还可以按虚拟机的实现进行筛选。例如,要使用通过AdoptOpenJDK分发的Open J9 JVM,可以按以下示例中的实现进行筛选。

java {
    
    
    toolchain {
    
    
        languageVersion = JavaLanguageVersion.of(11)
        vendor = JvmVendorSpec.ADOPTOPENJDK
        implementation = JvmImplementation.J9
    }
}
查看所有可用的工具链

为了查看检测到了哪些工具链及其相应的元数据,Gradle 6.8现在提供了有关javaToolchains任务的一些见解。

输出 gradle -q javaToolchains

 + Options
     | Auto-detection:     Enabled
     | Auto-download:      Enabled

 + AdoptOpenJDK 1.8.0_242
     | Location:           /path/to/8.0.242.hs-adpt/jre
     | Language Version:   8
     | Vendor:             AdoptOpenJDK
     | Is JDK:             true
     | Detected by:        SDKMAN!

 + OpenJDK 15-ea
     | Location:           /path/to/java/15.ea.21-open
     | Language Version:   15
     | Vendor:             AdoptOpenJDK
     | Is JDK:             true
     | Detected by:        SDKMAN!

 + Oracle JDK 1.7.0_80
     | Location:           /Library/Java/jdk1.7.0_80.jdk/jre
     | Language Version:   7
     | Vendor:             Oracle
     | Is JDK:             true
     | Detected by:        macOS java_home

这可以帮助调试可用于构建的工具链,以及是否检测到预期的工具链或需要手动设置。有关工具链检测和使用的更多详细信息,请参见工具链文档。

四、复合材料改进

复合构建是一种将单独的Gradle构建组合到单个构建中的方法。每个构建都可以有单独的用途(构建逻辑,后端代码,前端代码),并且可以独立进行。

可以为包含的版本执行任务

Gradle现在允许用户直接从命令行从包含的内部版本执行任务。例如,如果您的构建包含my-other-project为包含的构建,并且它的子项目sub带有task foo,那么您可以foo使用以下命令执行:

gradle :my-other-project:sub:foo

注意,不像一个多项目构建,运行gradle build将不会运行build在所有的包括建造任务。你能介绍任务相关性,以生命周期的任务中包括建立,如果你想为包括建立重现这一行为。

IDE对从包含的内部版本执行任务的支持可能尚未完全起作用,具体取决于IDE。计划对IntelliJ IDEA和Eclipse Buildship进行更新以完全支持这一点。今天,在IntelliJ IDEA中,您可以创建Gradle运行配置以直接执行任务(就像在命令行上一样)。

现在完全支持构建之间的期望周期

在某些情况下,需要在包含的内部版本之间进行循环。例如,如果两个内部版本都包含需要两个内部版本代码的端到端测试。单个构建的子项目可以进行此类设置,但不同构建的项目之间未完全支持这种设置。在此版本中,这是可能的,并且Gradle仅在任务之间存在周期时才会失败。在IDE中导入此类内部版本的问题也已修复。

用于组合构建和结构化软件项目的新文档

Gradle的文档现在包含一个用于使用组合构建来构建软件项目的示例,以及关于使用组合构建来构建软件项目的新一章。

五、依赖管理的改进

一致的依赖性解析

在构建过程中,Gradle中的依赖关系解析经常发生。从类路径到编译代码或运行测试,再到用于静态分析的工具,它们都在某个时刻将配置解析为一组依赖项。

但是,这些决议是孤立发生的。有时,为运行时类路径解析的依赖项与针对编译类路径解析的依赖项具有不同的版本。当仅在运行时出现的传递依赖项带来更高版本的第一级依赖项时,通常会发生这种情况。同样,测试的运行时类路径可以使用与生产代码的编译类路径不同的版本。

为了缓解此问题,Gradle现在允许您声明依赖项配置之间的一致性。例如,在Java生态系统中,您可以编写:

java {
    
    
    consistentResolution {
    
    
        useCompileClasspathVersions()
    }
}

这告诉Gradle运行时类路径和编译类路径之间的公共依赖关系应与编译时使用的版本对齐。

有许多配置此功能的选项,包括在Java生态系统之外使用的功能,这些内容在用户手册中进行了描述。

中央存储库声明

在以前的Gradle版本中,必须为每个(子)项目分别声明用于依赖性解析的存储库。但是,在大多数情况下,每个项目都应使用相同的存储库。

在Gradle 6.8中,现在可以方便地在整个构建中定义存储库settings.gradle(.kts):

dependencyResolutionManagement {
    
    
    repositories {
    
    
        mavenCentral()
    }
}

这样,Gradle可以确保您使用相同的存储库来解决构建的所有项目中的依赖项。通过阅读如何声明整个版本库来了解更多信息。

组件元数据规则的集中声明

组件元数据规则是修复发布在远程存储库上的不良元数据的强大工具。但是,类似于存储库,传统上必须对每个项目应用规则。从此版本开始,可以在以下位置的中央位置声明组件元数据规则settings.gradle(.kts)

dependencyResolutionManagement {
    
    
    components {
    
    
        withModule('com.google.guava:guava', GuavaRule)
    }
}
锁定Gradle设置依赖项

依赖锁定使使用动态版本的构建具有确定性。

到目前为止,您可以从项目或项目buildscript类路径中锁定依赖项配置。这个版本增加了对Gradlesettings.gradle(.kts)锁配置的支持:

buildscript {
    
    
    configurations.classpath {
    
    
        resolutionStrategy.activateDependencyLocking()
    }
}

六、其他改进

测试重新运行的JUnit XML报告增强功能

Test用于执行JVM测试的任务以“ JUnit XML”伪标准的HTML和一组XML文件的形式报告测试结果。CI服务器和其他工具通常通过XML文件观察测试结果。mergeReruns添加了一个新选项,该选项更改了在XML文件中报告多次执行的测试的方式。

test {
    
    
    reports.junitXml.mergeReruns = true
}

当这个新选项启用,如果测试失败,但随后重试,并成功了,它的失败将被记录作为<flakyFailure>替代<failure>,一个内<testcase>。与启用重新运行时,Apache Maven™的surefire插件生成的报告相同。如果您的CI服务器理解此格式,则表明测试不可靠。

默认情况下,此选项是禁用的,从而导致每个测试执行<testcase>在XML中单独列出。这意味着当多次执行测试时,例如由于失败重试机制,该测试会被多次列出。这也是所有以前的Gradle版本的行为。

如果您使用的是构建扫描或Gradle Enterprise,则无论此设置如何,都会检测到不稳定的测试。

在Java测试文档中了解有关此新功能的更多信息。

@Inject 是隐式导入

现在,在开发插件,任务或项目扩展时使用依赖注入时,现在可以使用@Inject注释而无需将其显式导入到构建脚本中,就像对其他Gradle API类的工作方式一样。

将具有定制源集的项目导入Eclipse
此版本的Gradle解决了使用自定义源集(例如其他功能测试源集)的项目的问题。

现在,自定义源集已自动导入Eclipse,并且不再需要在构建中进行手动配置。

不需要单独升级到Eclipse Buildship。

七、安全改进

默认情况下,不再启用过时的TLS版本
此版本的Gradle从默认的允许协议列表中删除TLS协议v1.0和v1.1。解决依赖关系时,默认情况下,Gradle将不再回退到TLS v1.0或v1.1。默认情况下仅允许使用TLS v1.2或TLS v1.3。

可以通过手动指定系统属性https.protocols以及构建所需的协议逗号分隔列表来重新启用这些TLS版本。

绝大多数构建不需要进行任何更改。Maven Central和JCenter / Bintray在2018年放弃了对TLS v1.0和TLS v1.1的支持。自Java 7以来,Java已有TLS v1.2可用。在Gradle中禁用这些协议可以保护构建免受降级攻击。

根据使用的Java版本,Gradle在与远程存储库通信时将协商TLS v1.2或TLS v1.3。

注意:早期版本的JDK 11和JDK 12在TLSv1.3处理逻辑中包含竞争条件错误,该错误会导致异常javax.net.ssl.SSLException: No PSK available. Unable to resume。如果遇到此问题,建议您更新到最新的次要JDK版本。

八、已解决的问题

Gradle 6.8.1中修复了11个问题。

  • [ #15890 ] -Gradle 6.8:无法编写XML测试结果
  • [ #15874 ]-Kotlin DSL入门中的链接断开和过时
  • [ #15827 ]-当maven-compiler-plugin不包含<configurtion>时,Maven2Gradle插件将失败,并出现NullPointerException
  • [ #15787 ] -Gradle 6.8无法使用settings.gradle中定义的Repo正确解析类路径上的Groovy
  • [ #15781 ]-Gradle 6.8错误地将二进制依赖项交换为项目依赖项
  • [ #15772]-无法通过初始化脚本配置dependencyResolutionManagement
  • [ #15762]-促进孵化–watch-fs命令行参数
  • [ #15747 ]-6.8中关于实验性Kotlin编译器功能回归的警告
  • [ #15742 ]-中央存储库声明不适用于Groovy
  • [ #15740 ]-升级到6.8后,无法在src / test / resources中包含属性文件的项目中包含格式错误的unicode内容的项目无法构建
  • [ #15731 ]-6.8:如果项目依赖项在发布中使用经过修改的artifactId,则在生成的pom中使用过时的artifactId

灰机送你一程: Gradle 官网地址

猜你喜欢

转载自blog.csdn.net/ii950606/article/details/113256270