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

💡
如果您使用的是Android Gradle,则需要同时升级到Android Gradle插件和Android Studio的3.3版或更高版本.

For all users

  1. 如果尚未使用最新的4.10.x版本,请阅读以下各节以帮助您将项目升级到最新的4.10.x版本. 我们建议升级到最新的4.10.x版本,以获取最有用的警告和弃用信息,然后再升级到5.0. 避免同时升级Gradle并迁移到Kotlin DSL,以便在出现潜在问题时简化故障排除.

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

    Deprecations View of a Gradle Build Scan

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

    另外,您可以运行gradle help --warning-mode=all来查看控制台中的弃用项,尽管它可能不会报告太多详细信息.

  3. 更新您的插件.

    有些插件将随新版本的Gradle一起中断,例如,因为它们使用已被删除或更改的内部API. 上一步将通过在插件确实尝试使用API​​弃用的部分时发出弃用警告来帮助您识别潜在的问题.

    In particular, you will need to use at least a 2.x version of the 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还添加了一些重要的新功能和改进的功能,您应该在构建中考虑使用这些功能:

需要注意的其他值得注意的更改可能会破坏您的构建,包括:

Upgrading from 4.10 and earlier

如果您尚未使用4.10版本,请跳至适用于当前Gradle版本的部分,然后逐步升级,直至到达此处. 然后,从Gradle 4.10移至5.0时应用这些更改.

Other changes

  • The enableFeaturePreview('IMPROVED_POM_SUPPORT') and enableFeaturePreview('STABLE_PUBLISHING') flags are no longer necessary. These features are now enabled by default.

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

Potential breaking changes

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

以下重大变化不是由于弃用,而是行为变化的结果:

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

General
  • <<对于任务定义不再有效. 换句话说,您不能使用语法task myTask << { …​ } .

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

    task myTask {
        doLast {
            ...
        }
    }
  • 您不能再在域对象名称中使用以下任何字符,例如项目和任务名称:<space> / \ : < > " ? * | .您也不应使用.作为开头或结尾字符.

Running Gradle & build environment
  • 如前所述,Gradle不能再在Java 7上运行.但是,您仍然可以使用派生的编译和测试来构建和测试Java 6及更高版本的软件.

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

  • -Dtest.debug命令行选项已删除-使用--debug-jvm选项代替.

  • -u / --no-search-upward命令行选项已删除-确保所有构建都具有settings.gradle文件.

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

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

  • DirectoryBuildCache.setTargetSizeInMB(long)方法已删除-使用DirectoryBuildCache.removeUnusedEntriesAfterDays代替.

  • The org.gradle.readLoggingConfigFile system property no longer does anything — update affected tests to work with your java.util.logging settings.

Working with files
Java builds
Tasks & properties
  • 删除了以下与惰性属性相关的旧类和方法-使用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
  • 不再支持Play 2.2-请升级您使用的Play版本.

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

Kotlin DSL
  • Artifact配置访问器现在具有NamedDomainObjectProvider<Configuration>类型,而不是Configuration

  • PluginAware.apply<T>(to)重命名为PluginAware.applyTo<T>(target) .

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

Miscellaneous
  • 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软件包默认不再导入.

    理想情况下,您不应该使用此软件包中的类,但是,作为快速解决方案,您可以将显式导入添加到这些类的构建脚本中.

  • The gradlePluginPortal() repository no longer looks for JARs without a POM by default.

  • Tooling API不能再使用Gradle 2.6以下的Gradle版本连接到构建. 通过TestKit运行的构建也是如此.

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

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

  • 在以前的Gradle版本中,可以从子类访问SourceTasksource字段. 现在不再是这种情况了,因为现在将source字段声明为private .

  • 在Worker API中, 不能再设置worker的工作目录 .

  • 依赖关系和版本约束有关的行为更改可能会影响少量用户.

  • 对DefaultTask上的属性工厂方法进行了一些更改,这些更改可能会影响自定义任务的创建.

Upgrading from 4.9 and earlier

如果您尚未使用4.9版,请跳至适用于当前Gradle版本的部分,然后逐步升级,直至到达此处. 然后,在升级到Gradle 4.10时应用这些更改.

Deprecated classes, methods and properties

按照API链接了解如何处理这些弃用(如果此处未提供其他信息):

Potential breaking changes

Upgrading from 4.8 and earlier

Potential breaking changes

Upgrading from 4.7 and earlier

Potential breaking changes

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

  • TaskContainer.remove()现在实际上删除了给定的任务-一些插件可能不小心依赖了旧的行为.

  • Gradle now honors implicit wildcards in Maven POM exclusions.

  • Kotlin DSL现在遵守JSR-305封装注释.

    这将导致根据JSR-305注释的某些类型在以前被视为不可为空的情况下被视为可为空. 这可能会导致生成脚本中的编译错误. 有关详细信息,请参阅相关的Kotlin DSL发行说明 .

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

Deprecations

在此发行版之前,允许内部版本替换内置任务. 不推荐使用此功能 .

不应替换的内置任务的完整列表是: wrapperinithelptasksprojectsbuildEnvironmentcomponentsdependenciesdependencyInsightdependentComponentsmodelproperties .

Upgrading from 4.6 and earlier

Potential breaking changes

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

    除非您通过checkstyle.configDircheckstyle.config显式配置它们的路径,否则子项目中的Checkstyle配置文件(旧的约定场所)将被忽略.

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

  • 与编译,链接和安装相关的许多本机任务的API 发生了重大变化 .

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

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

  • [Kotlin DSL]现在仅允许一个pluginManagement {}块.

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

  • getEnabledDirectoryReportDestinations()getEnabledFileReportDestinations()getEnabledReportNames()已从org.gradle.api.reporting.ReportContainer删除.

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

Upgrading from 4.5 and earlier

Deprecations

  • 您不应将注释处理器放在编译类路径上,也不要使用-processorpath编译器参数对其进行声明.

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

  • 使用CommandLineArgumentProvider代替CompilerArgumentProvider .

Potential breaking changes

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

  • StartParameter.taskOutputCacheEnabled属性已由StartParameter.setBuildCacheEnabled(boolean)取代.

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

  • Gradle已用4.5.5版本替换了HttpClient 4.4.1.

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

Upgrading from 4.4 and earlier

  • 确保您拥有settings.gradle文件:它避免了性能下降,并允许您设置根项目的名称.

  • Gradle现在忽略包含的构建( 复合构建 )的构建缓存配置,而是对所有构建使用根构建的配置.

Potential breaking changes

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

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

  • HttpBuildCache no longer follows redirects.

  • Depend任务类型已被删除.

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

  • ListProperty不再扩展Property .

Upgrading from 4.3 and earlier

Potential breaking changes

Upgrading from 4.2 and earlier

Other deprecations

Potential breaking changes

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

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

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

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

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

  • 现在, AbstractNativeCompileTask.objectFileDir的类型为DirectoryProperty而不是File .

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

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

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

    例如,如果发现some-module的依赖项的版本范围为[3,6]并且可传递地使用范围为[4,8] ,则Gradle现在选择版本6而不是8.先前的行为是选择8.

  • 现在,标记为@OutputFiles@OutputDirectories Iterable属性中的元素顺序@OutputDirectories重要. 如果顺序更改,则该属性将不再被认为是最新的.

    最好将单独的属性与@OutputFile / @OutputDirectory批注一起使用,或者将Map属性与@OutputFiles / @OutputDirectories一起使用.

  • 当存在可以检查的另一个存储库时,Gradle将不再忽略该存储库中的依赖项解决错误. 依赖关系解析将失败. 这导致相对于分辨率结果更具确定性的行为.

Upgrading from 4.1 and earlier

Potential breaking changes

  • TaskFilePropertyBuilderTaskOutputFilePropertyBuilder上的withPathSensitivity()方法已被删除.

  • 捆绑的bndlib已从3.2.0升级到3.4.0.

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

Upgrading from 4.0

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

Deprecated classes, methods and properties

按照API链接了解如何处理这些弃用(如果此处未提供其他信息):

Potential breaking changes

  • 现在,与Java项目具有项目依赖性的非Java项目现在默认情况下使用runtimeElements配置,而不是default配置.

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

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

  • [Kotlin DSL]基本软件包从org.gradle.script.lang.kotlin重命名为org.gradle.kotlin.dsl .

Changes in detail

[5.0] Default memory settings changed

现在,命令行客户端从64MB的堆开始,而不是1GB. 这可能会影响使用--no-daemon模式直接在客户端VM内部运行的生成. 我们不建议使用--no-daemon ,但是,如果必须使用它,则可以使用GRADLE_OPTS环境变量来增加可用内存.

Gradle守护程序现在从512MB的堆而不是1GB的堆开始. 大型项目可能必须使用org.gradle.jvmargs属性来增加此设置.

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

[5.0] New default versions for code quality plugins

The default tool versions of the following code quality plugins have been updated:

  • Checkstyle插件现在默认使用8.12而不是6.19.

  • 现在,默认情况下, CodeNarc插件使用1.2.1而不是1.1.

  • JaCoCo插件现在默认使用0.8.2而不是0.8.1.

  • 现在, PMD插件默认使用6.8.0而不是5.6.1.

    此外,默认规则集已从现已弃用的java-basic更改为category/java/errorprone.xml .

    但是,我们建议显式配置规则集.

[5.0] Library upgrades

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 .

  • The Google Cloud Storage JSON API Client Library used to access Google Cloud Storage backed Maven/Ivy repositories has been upgraded from v1-rev116-1.23.0 to v1-rev136-1.25.0.

  • Ivy已从2.2.0升级到2.3.0 .

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

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

  • SLF4J已从1.7.16升级到1.7.25 .

[5.0] Improved support for dependency and version constraints

通过Gradle 4.x发布流,新的@Incubating功能已添加到依赖项解析引擎中. 这些包括复杂的版本约束( preferstrictlyreject ),依赖关系约束和platform依赖关系.

如果您一直在使用IMPROVED_POM_SUPPORT功能预览,使用约束条件或偏好,拒绝和其他特定版本指示,那么请确保对依赖项解析结果有一个很好的了解.

[5.0] BOM import

Gradle现在为导入物料清单(BOM)文件提供支持,该文件是有效的POM文件,使用<dependencyManagement>节来控制直接和传递依赖项的版本. 您需要做的就是将POM声明为platform依赖项.

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

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] Separation of compile and runtime dependencies when consuming POMs

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

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

  • 编译类路径包括不会影响编译的运行时作用域文件,当这些文件更改时,会导致不必要的重新编译.

通过这种新行为,Java和Java库插件都可以实现编译范围和运行时范围分离 . 这意味着编译类路径仅包含编译范围的依赖关系,而运行时类路径也添加了运行时范围的依赖关系. 如果您使用Gradle开发和发布Java库,并且在发布的范围中反映了apiimplementation依赖关系之间的分离,则这特别有用.

[5.0] Changes to property factory methods on DefaultTask

Property factory methods on DefaultTask are now final

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

Inputs and outputs are not automatically registered

这些方法返回的Property实例不再自动注册为任务的输入或输出. 需要以通常的方式将Property实例声明为输入或输出,例如,附加诸如@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 now bundles JAXB for Java 9 and above

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

Since Java 11 no longer contains the java.xml.bind module, Gradle now bundles JAXB 2.3.1 (com.sun.xml.bind:jaxb-impl) and uses it on Java 9 and above.

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

[5.0] The gradlePluginPortal() repository no longer looks for JARs without a POM by default

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

在没有POM的情况下发布到Maven存储库的工件应得到修复. 如果遇到此类工件,请让插件或库作者发布具有适当元数据的新版本.

If you are stuck with a bad plugin, you can work around by re-enabling JARs as metadata source for the gradlePluginPortal() repository:

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

Java Library Distribution Plugin utilizes Java Library Plugin

另外,由插件创建的默认发行版将包含runtimeClasspath配置的所有工件,而不是不建议使用的runtime配置.

Configuration Avoidance API disallows common configuration errors

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仅在必要时执行配置操作,因此任务barregister()仅在配置了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: working directory of a worker can no longer be set

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

现在,所有工作人员都使用相同的工作目录来启用重用.

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

[4.10] Publishing to AWS S3 requires new permissions

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] Consider trying the lazy API for task creation and configuration

Gradle 4.9引入了一种新的方式来创建和配置惰性工作的任务. 当您将这种方法用于配置成本很高的任务时,或者当您有许多任务时,如果这些任务不运行,则构建配置时间会大大减少.

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

[4.8] Switch to the Maven Publish and Ivy Publish Plugins

现在,发布插件已经稳定了,我们建议您从标准Ja​​va项目(即基于Java Plugin的那些)的旧发布机制中迁移. 其中包括使用以下任何一项的项目: Java库插件应用程序插件War插件 .

要使用新方法,只需用publishing {}块替换任何upload<Conf>配置. 有关更多信息,请参见发布概述一章 .

[4.8] Use deferred configuration for publishing plugins

在Gradle 4.8之前,对publishing {}块进行了隐式处理,就好像在评估项目后已执行了其中的所有逻辑. 这令人困惑,因为它是唯一以这种方式运行的块. 作为Gradle 4.8稳定工作的一部分,我们将弃用此行为,并要求所有用户迁移其内部版本.

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

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

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

例如,在这种新行为下,以下逻辑假定设置了artifactId之后, jar.archiveBaseName不变:

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

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

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] Configure existing wrapper and init tasks

You should no longer define your own wrapper and init tasks. Configure the existing tasks instead, for example by converting this:

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

对此:

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

[4.8] Gradle now honors implicit wildcards in Maven POM exclusions

如果Maven POM中的排除项缺少groupIdartifactId ,则Gradle会忽略该排除项. 现在,缺少的元素被当作隐式通配符处理,例如<groupId>*</groupId> ,这意味着您的某些依赖项现在可能会被排除在以前的位置.

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

[4.7] Changes to the structure of Gradle’s plain console output

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

  • 现在,即使其他任务与其并行执行,由给定任务产生的输出也可以分组在一起.

  • 任务执行标头以">"任务前缀打印.

  • 在生成执行过程中产生的所有输出都将写入标准输出文件句柄. 这包括写入System.err的消息,除非您要将标准错误重定向到文件或任何其他非控制台目标.

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

[4.6] Changes to the APIs of native tasks related to compilation, linking and installation

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

以下任务已更改:

AbstractLinkTask and its subclasses
  • getDestinationDir()被替换getDestinationDirectory()

  • getBinaryFile()getOutputFile()getLinkedFile()取代.

  • setOutputFile(File)已删除. 使用Property.set()代替.

  • setOutputFile(Provider)已删除. 使用Property.set()代替.

  • getTargetPlatform()更改为返回Property .

  • setTargetPlatform(NativePlatform)已删除. 使用Property.set()代替.

  • getToolChain()已更改为返回Property .

  • setToolChain(NativeToolChain)已删除. 使用Property.set()代替.

CreateStaticLibrary
  • getOutputFile()更改为返回Property .

  • setOutputFile(File)已删除. 使用Property.set()代替.

  • setOutputFile(Provider)已删除. 使用Property.set()代替.

  • getTargetPlatform()更改为返回Property .

  • setTargetPlatform(NativePlatform)已删除. 使用Property.set()代替.

  • getToolChain()已更改为返回Property .

  • setToolChain(NativeToolChain)已删除. 使用Property.set()代替.

  • getStaticLibArgs()已更改为返回ListProperty .

  • setStaticLibArgs(List)已删除. 使用ListProperty.set()代替.

InstallExecutable
  • getSourceFile()getExecutableFile()取代.

  • getPlatform()getTargetPlatform()取代.

  • setTargetPlatform(NativePlatform)已删除. 使用Property.set()代替.

  • getToolChain()已更改为返回Property .

  • setToolChain(NativeToolChain)已删除. 使用Property.set()代替.

以下还看到了类似的更改:

[4.6] Visual Studio integration only supports a single solution file for all components of a build

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

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

此外,不再需要单独的任务来为每个组件生成解决方案文件,而是可以通过单个visualStudio任务来生成包含构建中所有组件的解决方案文件.

[4.5] HttpBuildCache no longer follows redirects

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

[4.4] Third-party dependency upgrades

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

  • 杰克逊:2.6.6→2.8.9

  • plexus-utils:2.0.6→2.1

  • xercesImpl:2.9.1→2.11.0

  • bsh:2.0b4→2.0b6

  • 弹跳城堡:1.57→1.58

这可以修复以下安全问题:

Gradle不会针对这些第三方依赖项公开公共API,但是那些自定义Gradle的人会希望知道.