本章提供将旧版 Gradle 4.x 版本迁移到 Gradle 5.0 所需的信息。在大多数情况下,您需要应用您要升级的版本之后的所有版本中的更改。例如,如果您要从 Gradle 4.3 升级到 5.0,则还需要应用从 4.4、4.5 等一直到 5.0 的更改。

如果您使用 Android 版 Gradle,则需要将 Android Gradle 插件和 Android Studio 迁移到 3.3 或更高版本。

对于所有用户

  1. 如果您尚未使用最新的 4.10.x 版本,请阅读以下部分以获取将项目升级到最新的 4.10.x 版本的帮助。我们建议升级到最新的 4.10.x 版本,以便在升级到 5.0 之前获取最有用的警告和弃用信息。避免同时升级 Gradle 和迁移到 Kotlin DSL,以便在出现潜在问题时轻松进行故障排除。

  2. 尝试运行gradle help --scan并查看生成的构建扫描的弃用视图。如果没有警告,则不会出现“弃用”选项卡。

    Gradle 构建扫描的弃用视图

    这样您就可以看到适用于您的构建的任何弃用警告。如果您尝试直接升级到 Gradle 5.x,它将生成(可能不太明显)错误。

    或者,您可以运行gradle help --warning-mode=all以在控制台中查看弃用信息,尽管它可能不会报告那么多详细信息。

  3. 更新您的插件。

    一些插件将与这个新版本的 Gradle 兼容,例如因为它们使用已删除或更改的内部 API。当插件尝试使用 API 的已弃用部分时,上一步将通过发出弃用警告来帮助您识别潜在问题。

    特别是,您需要至少使用 2.x 版本的Shadow Plugin

  4. 运行gradle wrapper --gradle-version 5.0将项目更新到5.0

  5. 如果您还没有迁移到 Java 8 或更高版本,请迁移到该版本。 Gradle 4.x 需要 Java 7 才能运行,而 Gradle 5 则需要 Java 8 才能运行。

  6. 阅读从 4.10 升级部分并进行任何必要的更改。

  7. 尝试运行该项目并使用故障排除指南调试任何错误。

此外,Gradle 添加了几个重要的新功能和改进功能,您应该考虑在构建中使用这些功能:

其他需要注意的可能会破坏您的构建的显着变化包括:

从 4.10 及更早版本升级

如果您尚未使用 4.10 版本,请跳到适用于您当前 Gradle 版本的部分,然后继续向上操作,直到到达此处。然后,从 Gradle 4.10 迁移到 5.0 时应用这些更改。

其他变化

  • enableFeaturePreview('IMPROVED_POM_SUPPORT')标志enableFeaturePreview('STABLE_PUBLISHING')不再需要。这些功能现在默认启用。

  • Gradle 现在捆绑了适用于 Java 9 及更高版本的JAXB 。您可以--add-modules java.xml.bind从 中删除该选项org.gradle.jvmargs(如果已设置)。

潜在的重大变化

本节中的更改有可能破坏您的构建,但绝大多数已被弃用相当长一段时间,并且很少有构建会受到大量更改的影响。我们强烈建议首先升级到 Gradle 4.10,以获得有关哪些弃用影响您的构建的报告。

以下重大更改并非来自弃用,而是行为更改的结果:

以下重大更改将在 Gradle 4.10 中显示为弃用警告:

一般的
  • <<任务定义不再有效。换句话说,你不能使用语法task myTask << { …​ }

    请改用Task.doLast()方法,如下所示:

    task myTask {
        doLast {
            ...
        }
    }
  • 您不能再在域对象名称(例如项目和任务名称)中使用以下任何字符: <space> / \ : < > " ? * |。您也不应该用作.前导或尾随字符。

运行 Gradle 和构建环境
  • 如前所述,Gradle 无法再在 Java 7 上运行。但是,您仍然可以使用分叉编译和测试来构建和测试 Java 6 及更高版本的软件。

  • 命令-Dtest.single行选项已被删除 - 使用测试过滤代替。

  • 命令-Dtest.debug行选项已被删除 - 请改用该--debug-jvm选项

  • -u/命令行选项--no-search-upward已被删除 - 确保您的所有构建都有一个settings.gradle文件。

  • 命令--recompile-scripts行选项已被删除。

  • 您不能再将 Gradle 构建嵌套在另一个 Gradle 构建的子目录中,除非嵌套构建具有settings.gradle文件。

  • DirectoryBuildCache.setTargetSizeInMB(long)方法已被删除 - 请改用DirectoryBuildCache.removeUnusedEntriesAfterDays

  • 系统org.gradle.readLoggingConfigFile属性不再执行任何操作 - 更新受影响的测试以使用您的java.util.logging设置。

处理文件
Java 构建
任务和属性
  • 以下与惰性属性相关的遗留类和方法已被删除 - 使用ObjectFactory.property()创建Property实例:

    • PropertyState

    • DirectoryVar

    • RegularFileVar

    • ProjectLayout.newDirectoryVar()

    • ProjectLayout.newFileVar()

    • Project.property(Class)

    • Script.property(Class)

    • ProviderFactory.property(Class)

  • 使用任务配置避免API配置和注册的任务对可从配置操作调用的其他方法有更多限制。

  • 内部@Option@OptionValues注释——包org.gradle.api.internal.tasks.options——已被删除。请改用公共@Option@OptionValues注释。

  • Task.deleteAllActions()方法已被删除,没有替代。

  • Task.dependsOnTaskDidWork()方法已被删除 - 使用声明的输入和输出代替。

  • 以下属性和方法TaskInternal已被删除 - 使用任务依赖项、任务规则、可重用实用程序方法或Worker API来代替直接执行任务。

    • execute()

    • executer

    • getValidators()

    • addValidator()

  • 不能再使用解析为单个常规文件以外的任何内容的参数来调用TaskInputs.file (Object)方法。

  • 不能再使用解析为单个目录以外的任何内容的参数来调用TaskInputs.dir (Object)方法。

  • 您无法再通过TaskInputsTaskOutputs注册无效的输入和输出。

  • TaskDestroyables.file()方法TaskDestroyables.files()已被删除 - 使用TaskDestroyables.register()代替。

  • SimpleWorkResult已被删除——使用WorkResult.didWork

  • 覆盖 4.8 中已弃用的内置任务现在会产生错误。

    尝试替换内置任务将产生类似于以下内容的错误:

    > Cannot add task 'wrapper' as a task with that name already exists.
Scala与演奏
  • Play 2.2 不再受支持 - 请升级您正在使用的 Play 版本。

  • ScalaDocOptions.styleSheet属性已被删除 - Scala 2.11.8 及更高版本中的 Scaladoc Ant 任务不再支持该属性。

KotlinDSL
  • 工件配置访问器现在具有类型NamedDomainObjectProvider<Configuration>而不是Configuration

  • PluginAware.apply<T>(to)被更名了PluginAware.applyTo<T>(target)

这两项更改都可能导致脚本编译错误。请参阅Gradle Kotlin DSL 发行说明,了解更多信息以及如何修复因上述更改而损坏的构建。

各种各样的
  • ConfigurableReport.setDestination(Object)方法已被删除 - 请改用ConfigurableReport.setDestination(File)

  • Signature.setFile(File)方法已被删除 - Gradle 不支持更改生成签名的输出文件。

  • 只读Signature.toSignArtifact属性已被删除——它不应该成为公共 API 的一部分。

  • @DeferredConfigurable注释已被删除。

  • 该方法isDeferredConfigurable()已从 中删除ExtensionSchema

  • IdeaPlugin.performPostEvaluationActions()EclipsePlugin.performPostEvaluationActions()已被删除。

  • The `BroadcastingCollectionEventRegister.getAddAction()方法已被删除,没有替代方法。

  • org.gradle.util默认情况下不再导入内部包。

    理想情况下,您不应使用此包中的类,但是,作为快速修复,您可以将显式导入添加到这些类的构建脚本中。

  • 默认情况下,存储gradlePluginPortal()不再查找没有 POM 的 JAR

  • Tooling API 无法再使用 Gradle 2.6 以下的 Gradle 版本连接到构建。这同样适用于通过 TestKit 运行的构建。

  • Gradle 5.0 需要的 Tooling API 客户端最低版本为 3.0。较旧的客户端库无法再使用 Gradle 5.0 运行构建。

  • IdeaModule.getSourceDirs()IdeaModule Tooling API 模型元素包含检索资源和测试资源的方法,因此这些元素已从和的结果中删除IdeaModule.getTestSourceDirs()

  • 在以前的 Gradle 版本中,可以从子类访问sourcein 的字段。SourceTask现在情况不再是这样,因为该source字段现在被声明为private.

  • 在Worker API中,无法再设置Worker的工作目录

  • 与依赖性和版本限制相关的行为变化可能会影响少数用户。

  • DefaultTask 上的属性工厂方法发生了一些更改,可能会影响自定义任务的创建。

从 4.9 及更早版本升级

如果您尚未使用版本 4.9,请跳到适用于您当前 Gradle 版本的部分,然后继续向上操作,直到到达此处。然后,在升级到 Gradle 4.10 时应用这些更改。

已弃用的类、方法和属性

请点击 API 链接了解如何处理这些弃用(如果此处未提供额外信息):

潜在的重大变化

从 4.8 及更早版本升级

潜在的重大变化

从 4.7 及更早版本升级

潜在的重大变化

  • 如果找不到指定的初始化脚本,构建现在将失败。

  • TaskContainer.remove()现在实际上删除了给定的任务 - 某些插件可能意外地依赖于旧的行为。

  • Gradle 现在支持 Maven POM 排除中的隐式通配符

  • Kotlin DSL 现在尊重 JSR-305 包注释。

    这将导致一些根据 JSR-305 注释的类型被视为可为 null,而之前它们被视为不可为 null。这可能会导致构建脚本中出现编译错误。有关详细信息,请参阅相关的 Kotlin DSL 发行说明

  • 错误消息现在将定向到标准错误而不是标准输出,除非控制台同时附加到标准输出和标准错误。这可能会影响抓取构建的普通控制台输出的工具。如果您从早期版本的 Gradle 升级,请忽略此更改。

弃用

在此版本之前,允许构建替换内置任务。此功能已被弃用

不应替换的内置任务的完整列表是: wrapper, init, help, tasks, projects, buildEnvironment, components, dependencies, dependencyInsight, dependentComponents, model, properties

从 4.6 及更早版本升级

潜在的重大变化

  • 按照惯例,Gradle 现在将在根项目的config/checkstyle目录中查找 Checkstyle 配置文件。

    子项目中的 Checkstyle 配置文件(旧的惯例位置)将被忽略,除非您通过checkstyle.configDircheckstyle.config显式配置它们的路径。

  • Gradle 的普通控制台输出的结构已更改,这可能会破坏抓取该输出的工具。

  • 许多与编译、链接和安装相关的本机任务的 API发生了突破性的变化

  • [Kotlin DSL] 用于访问 Gradle 构建属性的委托属性(例如在gradle.properties中定义)现在必须显式键入。

  • [Kotlin DSL]plugins {}在嵌套作用域内声明块现在会引发异常。

  • [Kotlin DSL]pluginManagement {}现在只允许一个块。

  • 接口提供的缓存控制 DSLorg.gradle.api.artifacts.cache.*不再可用。

  • getEnabledDirectoryReportDestinations()getEnabledFileReportDestinations()并且getEnabledReportNames()已全部从 中删除org.gradle.api.reporting.ReportContainer

  • StartParameter.projectPropertiesStartParameter.systemPropertiesArgs现在返回不可变映射。

从 4.5 及更早版本升级

弃用

  • 您不应将注释处理器放在编译类路径上或使用-processorpath编译器参数声明它们。

    应该将它们添加到annotationProcessor配置中。如果您不需要任何处理,但您的编译类路径无意中包含处理器(例如作为您依赖的库的一部分),请使用-proc:none编译器参数来忽略它。

  • 使用CommandLineArgumentProvider代替CompilerArgumentProvider

潜在的重大变化

  • Java 插件现在sourceSetAnnotationProcessor为每个源集添加一个配置,如果其中任何一个与您现有的配置匹配,则可能会中断。我们建议您删除冲突的配置声明。

  • StartParameter.taskOutputCacheEnabled属性已替换为StartParameter.setBuildCacheEnabled(boolean)

  • Visual Studio 集成现在仅为构建中的所有组件配置单个解决方案

  • Gradle 已将 HttpClient 4.4.1 替换为版本 4.5.5。

  • Gradle 现在捆绑该kotlin-stdlib-jdk8工件而不是kotlin-stdlib-jre8.这可能会影响您的构建。请参阅Kotlin 文档了解更多详细信息。

从 4.4 及更早版本升级

潜在的重大变化

  • ValidateTaskProperties.setOutputFile()删除了两个重载方法。当从构建脚本访问任务时,它们会被自动生成的设置器替换,但构建脚本之外的插件和其他代码不会出现这种情况。

  • Maven Publish Plugin 现在生成更完整的 maven-metadata.xml 文件,包括维护元素列表<snapshotVersion>。某些旧版本的 Maven 可能无法使用此元数据。

  • HttpBuildCache不再遵循重定向

  • 任务Depend类型已被删除。

  • Project.file(Object)不再规范不区分大小写的文件系统上文件路径的大小写。现在,在这种情况下它会忽略大小写,并且不会触及文件系统。

  • ListProperty不再扩展Property

从 4.3 及更早版本升级

潜在的重大变化

从 4.2 及更早版本升级

其他弃用

潜在的重大变化

  • DefaultTask.newOutputDirectory()现在返回 aDirectoryProperty而不是 a DirectoryVar

  • DefaultTask.newOutputFile()现在返回 aRegularFileProperty而不是 a RegularFileVar

  • DefaultTask.newInputFile()现在返回 aRegularFileProperty而不是 a RegularFileVar

  • ProjectLayout.buildDirectory现在返回 aDirectoryProperty而不是DirectoryVar

  • AbstractNativeCompileTask.compilerArgs现在是类型ListProperty<String>而不是List<String>

  • AbstractNativeCompileTask.objectFileDir现在是 typeDirectoryProperty而不是File

  • AbstractLinkTask.linkerArgs现在是类型ListProperty<String>而不是List<String>

  • TaskDestroyables.getFiles()不再是公共 API 的一部分。

  • 现在,依赖项的版本范围重叠会导致 Gradle 选择满足所有声明范围的版本。

    例如,如果some-module发现对版本范围为 的依赖项[3,6]以及传递范围为 的依赖项[4,8],则 Gradle 现在会选择版本 6 而不是 8。之前的行为是选择 8。

  • 用 或者或nowIterable标记的属性中元素的顺序很重要。如果顺序发生变化,该属性将不再被视为是最新的。@OutputFiles@OutputDirectories

    @OutputFile更喜欢使用带有/@OutputDirectory注释的单独属性,或者使用带有/ 的Map属性。@OutputFiles@OutputDirectories

  • 当有另一个存储库可以检查时,Gradle 将不再忽略存储库中的依赖项解析错误。相反,依赖关系解析将会失败。这会导致解析结果更具确定性。

从 4.1 及更早版本升级

潜在的重大变化

  • TaskFilePropertyBuilderTaskOutputFilePropertyBuilderwithPathSensitivity()上的方法已被删除。

  • 捆绑包bndlib已从 3.2.0 升级到 3.4.0。

  • FindBugs 插件不再从其分析中呈现进度信息。如果您以任何方式依赖该输出,则可以使用FindBugs.showProgress启用它。

从4.0升级

  • 考虑使用新的Worker API来使构建中的工作单元能够并行运行。

已弃用的类、方法和属性

请点击 API 链接了解如何处理这些弃用(如果此处未提供额外信息):

潜在的重大变化

  • 与 Java 项目有项目依赖关系的非 Java 项目现在runtimeElements默认使用配置而不是配置default

    要覆盖此行为,您可以显式声明要在项目依赖项中使用的配置。例如:project(path: ':myJavaProject', configuration: 'default')

  • 默认 Zinc 编译器从 0.3.13 升级到 0.3.15。

  • [Kotlin DSL] 基础包从 重命名org.gradle.script.lang.kotlinorg.gradle.kotlin.dsl.

细节变化

[5.0] 默认内存设置已更改

命令行客户端现在以 64MB 堆启动,而不是 1GB。这可能会影响使用模式直接在客户端 VM 内运行的构建--no-daemon。我们不鼓励使用--no-daemon,但如果必须使用它,可以使用GRADLE_OPTS环境变量增加可用内存。

Gradle 守护进程现在以 512MB 堆启动,而不是 1GB。大型项目可能必须使用该org.gradle.jvmargs属性来增加此设置。

所有工作线程(包括编译器和测试执行器)现在都以 512MB 堆开始。以前的默认值是物理内存的 1/4。大型项目可能必须在相关任务上增加此设置,例如JavaCompileTest

[5.0] 代码质量插件的新默认版本

以下代码质量插件的默认工具版本已更新:

[5.0] 库升级

Gradle 使用的几个库已升级:

  • Groovy 从 2.4.15 升级到2.5.4

  • Ant 已从 1.9.11 升级到1.9.13

  • 用于访问 S3 支持的 Maven/Ivy 存储库的 AWS 开发工具包已从 1.11.267 升级到1.11.407

  • OSGi 插件使用的 BND 库已从 3.4.0 升级到4.0.0

  • 用于访问 Google Cloud Storage 支持的 Maven/Ivy 存储库的 Google Cloud Storage JSON API 客户端库已从 v1-rev116-1.23.0 升级到 v1-rev136-1.25.0。

  • Ivy 已从 2.2.0 升级到2.3.0

  • 该任务使用的 JUnit Platform 库Test已从 1.0.3 升级到 1.3.1。

  • 用于访问 Maven 存储库的 Maven Wagon 库已从 2.4 升级到 3.0.0。

  • SLF4J 已从 1.7.16 升级到1.7.25

[5.0] 改进了对依赖项和版本约束的支持

通过 Gradle 4.x 发布流,@Incubating依赖解析引擎中添加了新功能。其中包括复杂的版本约束 ( preferstrictlyreject)、依赖性约束和platform依赖性。

如果您一直在使用IMPROVED_POM_SUPPORT功能预览、使用约束或偏好、拒绝和其他特定版本指示,那么请务必仔细查看您的依赖项解析结果。

[5.0]BOM导入

Gradle 现在支持导入物料清单 (BOM) 文件,这些文件实际上是 POM 文件,使用<dependencyManagement>部分来控制直接和传递依赖项的版本。您所需要做的就是将 POM 声明为platform依赖项。

以下示例从声明的 Spring Boot BOM 中选择gson和依赖项的版本:dom4j

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

[5.0] 使用 POM 时编译和运行时依赖的分离

从 Gradle 1.0 开始,运行时范围的依赖项已包含在 Java 编译类路径中,这有一些缺点:

  • 编译类路径比需要的大得多,从而减慢了编译速度。

  • 编译类路径包含不影响编译的运行时范围文件,导致这些文件更改时不必要的重新编译。

通过这种新行为,Java 和 Java 库插件都实现了编译作用域和运行时作用域的分离。这意味着编译类路径仅包含编译范围的依赖项,而运行时类路径也添加运行时范围的依赖项。如果您使用 Gradle 开发和发布 Java 库,其中发布的范围中反映了之间的分离api和依赖关系,那么这尤其有用。implementation

[5.0] 属性工厂方法的更改DefaultTask

属性工厂方法DefaultTask现在是最终版本

诸如此类的属性工厂方法newInputFile()旨在从扩展的类型的构造函数中调用DefaultTask。这些方法现在是最终方法,以避免子类覆盖这些方法并使用未初始化的状态。

输入和输出不会自动注册

这些方法返回的属性实例不再自动注册为任务的输入或输出。属性实例需要以通常的方式声明为输入或输出,例如附加注释@OutputFile或使用运行时 API 来注册属性。

例如,您以前可以使用以下语法并将两个 outputFile 实例注册为声明的输出:

build.gradle
class MyTask extends DefaultTask {
    // note: no annotation here
    final RegularFileProperty outputFile = newOutputFile()
}

task myOtherTask {
    def outputFile = newOutputFile()
    doLast { ... }
}
build.gradle.kts
open class MyTask : DefaultTask() {
    // note: no annotation here
    val outputFile: RegularFileProperty = newOutputFile()
}

task("myOtherTask") {
    val outputFile = newOutputFile()
    doLast { ... }
}

现在你必须显式注册outputFile,如下所示:

build.gradle
class MyTask extends DefaultTask {
    @OutputFile // property needs an annotation
    final RegularFileProperty outputFile = project.objects.fileProperty()
}

task myOtherTask {
    def outputFile = project.objects.fileProperty()
    outputs.file(outputFile) // or to be registered using the runtime API
    doLast { ... }
}
build.gradle.kts
open class MyTask : DefaultTask() {
    @OutputFile // property needs an annotation
    val outputFile: RegularFileProperty = project.objects.fileProperty()
}

task("myOtherTask") {
    val outputFile = project.objects.fileProperty()
    outputs.file(outputFile) // or to be registered using the runtime API
    doLast { ... }
}

[5.0] Gradle 现在捆绑了适用于 Java 9 及更高版本的 JAXB

为了使用 S3 支持的工件存储库,您以前必须在 Java 9 及更高版本上运行时进行--add-modules java.xml.bind添加。org.gradle.jvmargs

由于 Java 11 不再包含该java.xml.bind模块,Gradle 现在捆绑 JAXB 2.3.1 ( com.sun.xml.bind:jaxb-impl) 并在 Java 9 及更高版本上使用它。

如果已设置,请--add-modules java.xml.bind从 中删除该选项org.gradle.jvmargs

[5.0]gradlePluginPortal()默认情况下,存储库不再查找没有 POM 的 JAR

有了这个新行为,如果在存储库中找到的插件或插件的传递依赖项gradlePluginPortal()没有 Maven POM,它将无法解析。

发布到没有 POM 的 Maven 存储库的工件应该得到修复。如果您遇到此类工件,请要求插件或库作者发布具有正确元数据的新版本。

如果您遇到问题插件,可以通过重新启用 JAR 作为gradlePluginPortal()存储库的元数据源来解决:

settings.gradle
pluginManagement {
    repositories {
        gradlePluginPortal().tap {
            metadataSources {
                mavenPom()
                artifact()
            }
        }
    }
}
settings.gradle.kts
pluginManagement {
    repositories {
        gradlePluginPortal().apply {
            (this as MavenArtifactRepository).metadataSources {
                mavenPom()
                artifact()
            }
        }
    }
}

Java 库分发插件利用 Java 库插件

此外,插件创建的默认发行版将包含runtimeClasspath配置的所有工件,而不是已弃用的runtime配置。

配置避免 API 不允许常见配置错误

Gradle 4.9 中引入的配置避免 API允许您避免创建和配置从未使用过的任务。

使用现有 API,此示例添加了两个任务 (foobar):

build.gradle
tasks.create("foo") {
    tasks.create("bar")
}
build.gradle.kts
tasks.create("foo") {
    tasks.create("bar")
}

当将其转换为使用新 API 时,会发生一些令人惊讶的事情:bar不存在。新的 API 仅在必要时执行配置操作,因此register()for 任务仅在配置bar时执行。foo

build.gradle
tasks.register("foo") {
    tasks.register("bar") // WRONG
}
build.gradle.kts
tasks.register("foo") {
    tasks.register("bar") // WRONG
}

为了避免这种情况,Gradle 现在会检测到这种情况,并防止在使用新 API 时对底层容器进行修改(通过create()或)。register()

[5.0] Worker API:无法再设置worker的工作目录

由于 JDK 11 不再支持更改正在运行的进程的工作目录,因此现在禁止通过其 fork 选项设置工作进程的工作目录。

所有工作人员现在都使用相同的工作目录以实现重用。

请改为传递文件和目录作为参数。

[4.10]发布到AWS S3需要新的权限

S3 存储库传输协议允许 Gradle 将工件发布到 AWS S3 存储桶。从此版本开始,上传到 S3 存储桶的每个工件都将配备bucket-owner-full-control固定 ACL。确保用于发布工件的AWS账户具有s3:PutObjectAcls3:PutObjectVersionAcl权限,否则上传将失败。

{
    "Version":"2012-10-17",
    "Statement":[
        // ...
        {
            "Effect":"Allow",
            "Action":[
                "s3:PutObject", // necessary for uploading objects
                "s3:PutObjectAcl", // required starting with this release
                "s3:PutObjectVersionAcl" // if S3 bucket versioning is enabled
            ],
            "Resource":"arn:aws:s3:::myCompanyBucket/*"
        }
    ]
}

有关更多信息,请参阅AWS S3 跨账户访问。

[4.9] 考虑尝试使用惰性 API 来创建和配置任务

Gradle 4.9 引入了一种创建和配置延迟工作任务的新方法。当您使用此方法来执行配置成本高昂的任务时,或者当您有很多很多任务时,当这些任务不运行时,您的构建配置时间可能会显着下降。

您可以在避免任务配置一章中了解有关延迟创建任务的更多信息。您还可以在此博文中了解此新功能的背景。

[4.8] 切换到 Maven Publish 和 Ivy Publish 插件

既然发布插件已经稳定,我们建议您从标准 Java 项目(即基于Java Plugin 的项目)的旧发布机制迁移。这包括使用以下任意一种的项目:Java Library PluginApplication PluginWar Plugin

要使用新方法,只需upload<Conf>用块替换任何配置即可publishing {}。有关详细信息,请参阅发布概述一章。

[4.8] 使用延迟配置来发布插件

在 Gradle 4.8 之前,该publishing {}块被隐式地视为内部的所有逻辑都是在项目评估后执行的。这很令人困惑,因为它是唯一表现出这种行为的块。作为 Gradle 4.8 稳定性工作的一部分,我们反对这种行为并要求所有用户迁移他们的构建。

可以通过将以下内容添加到设置文件来开启新的稳定行为:

settings.gradle
enableFeaturePreview('STABLE_PUBLISHING')
settings.gradle.kts
enableFeaturePreview("STABLE_PUBLISHING")

我们建议使用本地存储库进行测试运行,以查看所有工件是否仍然具有预期的坐标。在大多数情况下,一切都应该像以前一样工作,然后您就完成了。但是,您的发布块可能依赖于隐式延迟配置,特别是如果它依赖于在构建的配置阶段可能更改的值。

例如,在新行为下,以下逻辑假设设置jar.archiveBaseName后不会更改:artifactId

build.gradle
subprojects {
    publishing {
        publications {
            mavenJava {
                from components.java
                artifactId = jar.archiveBaseName
            }
        }
    }
}
build.gradle.kts
subprojects {
    publishing {
        publications {
            named<MavenPublication>("mavenJava") {
                from(components["java"])
                artifactId = tasks.jar.get().archiveBaseName.get()
            }
        }
    }
}

如果该假设不正确或将来可能不正确,则artifactId必须在块内设置afterEvaluate {},如下所示:

build.gradle
subprojects {
    publishing {
        publications {
            mavenJava {
                from components.java
                afterEvaluate {
                    artifactId = jar.archiveBaseName
                }
            }
        }
    }
}
build.gradle.kts
subprojects {
    publishing {
        publications {
            named<MavenPublication>("mavenJava") {
                from(components["java"])
                afterEvaluate {
                    artifactId = tasks.jar.get().archiveBbaseName.get()
                }
            }
        }
    }
}

[4.8]配置现有wrapper任务init

您不应该再定义自己的wrapper任务init。配置现有任务,例如通过转换:

build.gradle
task wrapper(type: Wrapper) {
    ...
}
build.gradle.kts
task<Wrapper>("wrapper") {
    ...
}

对此:

build.gradle
wrapper {
    ...
}
build.gradle.kts
tasks.wrapper {
    ...
}

[4.8] Gradle 现在支持 Maven POM 排除中的隐式通配符

如果 Maven POM 中的排除项缺少 agroupIdartifactId,Gradle 会忽略该排除项。现在,丢失的元素被视为隐式通配符 - 例如<groupId>*</groupId>- 这意味着您的某些依赖项现在可能会被排除在以前没有的地方。

您将需要显式声明所需的任何缺失的依赖项。

[4.7] Gradle 普通控制台输出结构的更改

普通控制台模式现在的输出格式与丰富控制台一致,这意味着输出格式已更改。例如:

  • 给定任务产生的输出现在被分组在一起,即使其他任务与其并行执行也是如此。

  • 任务执行标题打印时带有“> Task”前缀。

  • 构建执行期间产生的所有输出都会写入标准输出文件句柄。这包括写入 System.err 的消息,除非您将标准错误重定向到文件或任何其他非控制台目标。

这可能会破坏从普通控制台输出中抓取详细信息的工具。

[4.6] 与编译、链接和安装相关的本机任务 API 的更改

许多与编译、链接和安装本机库和应用程序相关的任务已转换为 Provider API,以便它们支持惰性配置。此转换对任务的 API 进行了一些重大更改,以便它们符合 Provider API 的约定。

以下任务已更改:

AbstractLinkTask及其子类
  • getDestinationDir()被替换为getDestinationDirectory().

  • getBinaryFile()getOutputFile()被替换为getLinkedFile()

  • setOutputFile(File)go掉了。代替使用Property.set()

  • setOutputFile(Provider)go掉了。代替使用Property.set()

  • getTargetPlatform()更改为返回 a Property

  • setTargetPlatform(NativePlatform)go掉了。代替使用Property.set()

  • getToolChain()更改为返回 a Property

  • setToolChain(NativeToolChain)go掉了。代替使用Property.set()

创建静态库
  • getOutputFile()更改为返回 a Property

  • setOutputFile(File)go掉了。代替使用Property.set()

  • setOutputFile(Provider)go掉了。代替使用Property.set()

  • getTargetPlatform()更改为返回 a Property

  • setTargetPlatform(NativePlatform)go掉了。代替使用Property.set()

  • getToolChain()更改为返回 a Property

  • setToolChain(NativeToolChain)go掉了。代替使用Property.set()

  • getStaticLibArgs()更改为返回 a ListProperty

  • setStaticLibArgs(List)go掉了。代替使用ListProperty.set()

安装可执行文件
  • getSourceFile()被替换为getExecutableFile().

  • getPlatform()被替换为getTargetPlatform().

  • setTargetPlatform(NativePlatform)go掉了。代替使用Property.set()

  • getToolChain()更改为返回 a Property

  • setToolChain(NativeToolChain)go掉了。代替使用Property.set()

以下也出现了类似的变化:

[4.6] Visual Studio 集成仅支持构建的所有组件的单个解决方案文件

VisualStudioExtension不再具有solutions属性。相反,您可以通过根项目中的VisualStudioRootExtension配置单个解决方案,如下所示:

build.gradle
model {
    visualStudio {
        solution {
            solutionFile.location = "vs/${name}.sln"
        }
    }
}

此外,不再有单独的任务为每个组件生成解决方案文件,而是visualStudio生成包含构建中所有组件的解决方案文件的单个任务。

[4.5]HttpBuildCache不再遵循重定向

当通过 连接到 HTTP 构建缓存后端时HttpBuildCache,Gradle 不再遵循重定向,而是将其视为错误。从构建缓存后端获取重定向主要是配置错误(例如使用“http”URL 而不是“https”),并且会对性能产生负面影响。

[4.4]第三方依赖升级

该版本包括第三方依赖项的多项升级:

  • 杰克逊:2.6.6 → 2.8.9

  • 丛实用程序:2.0.6 → 2.1

  • xercesImpl:2.9.1→2.11.0

  • BSH:2.0b4 → 2.0b6

  • 充气城堡:1.57 → 1.58

这修复了以下安全问题:

  • CVE-2017-7525(严重)

  • SONATYPE-2017-0359(严重)

  • SONATYPE-2017-0355(严重)

  • SONATYPE-2017-0398(严重)

  • CVE-2013-4002(严重)

  • CVE-2016-2510(严重)

  • SONATYPE-2016-0397(严重)

  • CVE-2009-2625(严重)

  • SONATYPE-2017-0348(严重)

Gradle 不会为这些第 3 方依赖项公开公共 API,但自定义 Gradle 的人需要注意。