本章提供了将Gradle 5.x构建迁移到Gradle 6.0所需的信息. 要从Gradle 4.x迁移,请先完成从4.x到5.0的指南 .

我们建议所有用户执行以下步骤:

  1. 尝试运行gradle help --scan并查看生成的构建扫描的弃用视图 .

    Deprecations View of a Gradle Build Scan

    This is so that you can see any deprecation warnings that apply to your build.

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

  2. 更新您的插件.

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

  3. 运行gradle wrapper --gradle-version 6.0.1将项目更新为6.0.1.

  4. 尝试使用《 故障排除指南》运行项目并调试所有错误.

Upgrading from 5.6 and earlier

Deprecations

Dependencies should no longer be declared using the compile and runtime configurations

Gradle 3.4开始,不鼓励在Java生态系统插件中使用compileruntime配置.

这些配置用于从main源代码集中编译和运行代码. 其他源集创建类似的配置(例如, test源集的testCompiletestRuntime )也不应使用. 应该使用implementationapicompileOnlyruntimeOnly配置来声明依赖关系,并使用compileClasspathruntimeClasspath配置来解决依赖关系. 请参阅这些配置的关系 .

Legacy publication system is deprecated and replaced with the *-publish plugins

不建议使用uploadArchives任务和maven插件.

用户应使用maven-publishivy-publish插件迁移到Gradle的发布系统 . 自Gradle 4.8起,这些插件一直稳定.

发布系统也是确保Gradle Module元数据发布的唯一方法.

Problems with tasks emit deprecation warnings

当Gradle检测到任务定义问题(例如错误定义的输入或输出)时,它将在控制台上显示以下消息:

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0/userguide/command_line_interface.html#sec:command_line_warnings

无论使用哪种命令行开关,都将在每次构建的构建扫描中显示不赞成使用的警告.

当使用--warning-mode all执行构建时,将显示单个警告:

> Task :myTask
Property 'inputDirectory' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
Property 'outputFile' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.

如果您拥有相关任务的代码,则可以按照建议进行修复. 您也可以使用--stacktrace来查看每个警告在代码中的位置.

否则,您需要将问题报告给相关任务或插件的维护者.

Old API for incremental tasks, IncrementalTaskInputs, has been deprecated

在Gradle 5.4中,我们引入了用于实现增量任务的新API: InputChanges . 不推荐使用基于IncrementalTaskInputs的旧API.

Forced dependencies

不建议在第一级依赖项上使用force = true强制强制依赖项版本.

强制同时具有语义和顺序问题,可以通过使用严格的版本约束来避免.

在Gradle 5.0中,我们删除了--no-search-upward CLI参数.

现在已弃用StartParameter的相关API(例如isSearchUpwards() ).

APIs BuildListener.buildStarted and Gradle.buildStarted have been deprecated

这些方法当前无法按预期方式工作,因为在构建开始之后将永远不会调用回调.

不建议使用该方法以避免混淆.

Implicit duplicate strategy for Copy or archive tasks has been deprecated

默认情况下,归档任务TarZip允许在创建的归档中存在同一路径的多个条目. 这可能会导致"严重无效的zip文件",从而触发zip炸弹检测 .

为了防止这种情况的意外发生,现在在创建存档时遇到重复会产生不赞成使用的消息,并且将使从Gradle 7.0开始的构建失败.

Copy任务还可以愉快地将具有相同相对路径的多个源复制到目标目录. 此行为也已被弃用.

如果要允许重复,则可以明确指定:

task archive(type: Zip) {
    duplicatesStrategy = DuplicatesStrategy.INCLUDE // allow duplicates
    ...
}

Executing Gradle without a settings file has been deprecated

Gradle构建由当前目录或父目录中的settings.gradle[.kts]文件定义. 没有设置文件,Gradle构建是未定义的,并且将发出弃用警告.

在Gradle 7.0中,Gradle仅允许您使用未定义的构建调用init任务或诊断命令行标志,例如--version .

Calling Project.afterEvaluate on an evaluated project has been deprecated

评估项目后,Gradle会忽略传递给Project#afterEvaluate所有配置,并发出弃用警告. 这种情况将成为Gradle 7.0中的错误.

Deprecated plugins

以下捆绑插件从未发布过,它们将在Gradle的下一个主要版本中删除:

  • org.gradle.coffeescript-base

  • org.gradle.envjs

  • org.gradle.javascript-base

  • org.gradle.jshint

  • org.gradle.rhino

其中一些插件可能会在插件门户上进行替换.

Potential breaking changes

Android Gradle Plugin 3.3 and earlier is no longer supported

Gradle 6.0支持Android Gradle插件版本3.4及更高版本.

Build scan plugin 2.x is no longer supported

对于Gradle 6,必须使用Gradle Enterprise插件代替对构建扫描插件的使用. 这还需要更改插件的应用方式. 请参阅https://gradle.com/help/gradle-6-build-scan-plugin了解更多信息.

Updates to bundled Gradle dependencies

Updates to default integration versions

Changes to build and task names in composite builds

以前,Gradle使用根项目的名称作为所包含构建的构建名称. 现在,使用构建的根目录名称,并且如果不相同,则不考虑根项目名称. 如果通过设置文件包含构建,则可以为构建指定其他名称.

includeBuild("some-other-build") {
    name = "another-name"
}

先前的行为是有问题的,因为它导致在构建期间的不同时间使用不同的名称.

buildSrc is now reserved as a project and subproject build name

以前,Gradle并未阻止将名称" buildSrc"用于多项目构建的子项目或作为包含的构建的名称. 现在,这是不允许的. 现在,将名称" buildSrc"保留给构建额外构建逻辑的常规buildSrc项目.

buildSrc的典型用法不受此更改的影响. 如果您的设置文件指定你只会受到影响include("buildSrc")includeBuild("buildSrc")

Scala Zinc compiler

Zinc编译器已升级到版本1.3.0. Gradle不再支持为Scala 2.9构建.

Gradle支持的最小Zinc编译器为1.2.0,最大测试版本为1.3.0.

为了使选择Zinc编译器的版本更加容易,您现在可以配置一个zincVersion属性:

scala {
    zincVersion = "1.2.1"
}

请删除您添加到zinc配置中的所有显式依赖项,并改用此属性. 如果您尝试使用com.typesafe.zinc:zinc依赖项,则Gradle将切换到新的Zinc实现.

Local build cache is always a directory cache

过去,可以将任何构建缓存实现用作local缓存. 不再允许这样做,因为本地缓存必须始终是DirectoryBuildCache .

使用除DirectoryBuildCache以外的任何类型作为类型调用BuildCacheConfiguration.local(Class)将使构建失败. 使用DirectoryBuildCache类型调用这些方法将产生弃用警告.

Use getLocal() and local(Action) instead.

Failing to pack or unpack cached results will now fail the build

过去,当Gradle在打包缓存任务的结果时遇到问题时,Gradle会忽略该问题并继续运行构建.

当遇到损坏的缓存工件时,Gradle会删除已解包的所有内容,然后重新执行任务以确保构建有成功的机会.

尽管此行为旨在使构建成功,但会产生隐藏问题的不利影响,并导致缓存性能下降.

在Gradle 6.0中,打包和解包错误都会导致构建失败,因此这些问题将更容易得到解决.

buildSrc projects automatically use build cache configuration

以前,为了将构建缓存用于buildSrc构建,您需要在buildSrc构建中复制构建缓存配置. 现在,它会自动使用顶级设置脚本定义的构建缓存配置.

Gradle Module Metadata is always published

在摇篮5.3正式出台, 摇篮模块元数据的建立是为了解决许多有多年困扰依赖管理,特别是问题,但不完全是在Java生态系统.

在Gradle 6.0中,默认情况下启用了Gradle模块元数据.

这意味着,如果使用Gradle发布库并使用maven-publishivy-publish插件,则传统元数据外,还将始终发布Gradle Module元数据文件.

传统的元数据文件将包含一个标记,以便Gradle知道还有其他元数据要使用.

Gradle Module Metadata has stricter validation

发布Gradle模块元数据时,将验证以下规则:

这些也记录在规范中.

Maven or Ivy repositories are no longer queried for artifacts without metadata by default

如果Gradle无法在repositories { }部分中定义的repositories { }找到模块的元数据文件( .pomivy.xml ),则现在假定该模块在该存储库中不存在.

对于动态版本,需要在Maven存储库中提供对应模块的maven-metadata.xml .

Previously, Gradle would also look for a default artifact (.jar). This behavior often caused a large number of unnecessary requests when using multiple repositories that slowed builds down.

您可以通过添加artifact() 元数据源来选择选定存储库的旧行为.

Changing the pom packaging property no longer changes the artifact extension

以前,如果pom包装不是jarejbbundlemaven-plugin ,则在发布期间会更改发布到Maven存储库的主要工件的扩展名,以匹配pom包装.

此行为导致Gradle Module元数据损坏,并且由于处理不同的包装类型而难以理解.

创建工件时,构建作者可以更改工件名称,以获得与以前相同的结果-例如,通过显式设置jar.archiveExtension.set(pomPackaging) .

An ivy.xml published for Java libraries contains more information

为了在ivy-publish插件中生成更正确的ivy.xml元数据,进行了许多修复.

结果, ivy.xml文件的内部结构已更改. 现在, runtime配置包含更多信息,这些信息对应于Java库的runtimeElements变体. default配置应产生与以前相同的结果.

通常,建议用户从ivy.xml迁移到新的Gradle Module元数据格式.

Classes from buildSrc are no longer visible to settings scripts

以前,buildSrc项目是在应用项目的设置脚本之前构建的,并且其类在脚本中可见. 现在,在设置脚本及其类对它不可见之后,将构建buildSrc. buildSrc类对于项目构建脚本和脚本插件仍然可见.

可以通过声明外部依赖项从设置脚本中使用自定义逻辑.

The pluginManagement block in settings scripts is now isolated

以前,设置脚本中的所有pluginManagement {}块都是在脚本正常执行期间执行的.

现在,它们以类似于buildscript {}plugins {}方式执行. 这意味着该块中的代码无法引用脚本中其他地方声明的任何内容.

进行了此更改,以便在为设置脚本本身解析插件时,也可以应用pluginManagement配置.

Plugins and classes loaded in settings scripts are visible to project scripts and buildSrc

以前,使用buildscript {}添加到a设置脚本中的任何类在脚本外部都不可见. 现在,它们对于所有项目构建脚本都是可见的.

它们对于buildSrc构建脚本及其设置脚本也是可见的.

进行了此更改,以便应用于设置脚本的插件可以为整个构建贡献逻辑.

Plugin validation changes

  • The validateTaskProperties task is now deprecated, use validatePlugins instead. The new name better reflects the fact that it also validates artifact transform parameters and other non-property definitions.

  • ValidateTaskProperties类型被ValidatePlugins取代.

  • setClasses()方法现已删除. 使用getClasses().setFrom()代替.

  • setClasspath()方法也将被删除. 使用getClasspath().setFrom()代替.

  • 默认情况下,现在已启用failOnWarning选项.

  • 现在,以下任务验证错误在运行时使构建失败,并被提升为ValidatePlugins的错误:

    • 任务属性带有不允许用于任务的属性注释,例如@InputArtifact .

Using the embedded-kotlin plugin now requires a repository

就像使用kotlin-dsl插件时一样,现在需要声明一个存储库,如果您应用embedded-kotlin插件,则可以在其中找到Kotlin依赖embedded-kotlin .

plugins {
    `embedded-kotlin`
}

repositories {
    jcenter()
}

Kotlin DSL IDE support now requires Kotlin IntelliJ Plugin >= 1.3.50

对于1.3.50之前的Kotlin IntelliJ插件版本,当Gradle JVM设置为不同于Project SDK中的版本时,将错误地突出显示Kotlin DSL脚本. 只需将您的IDE插件升级到> = 1.3.50,即可恢复正确的Kotlin DSL脚本突出显示行为.

Kotlin DSL script base types no longer extend Project, Settings or Gradle

在以前的版本中,Kotlin DSL脚本被编译为实现三个Gradle核心配置接口之一的类,以便向脚本隐式公开其API. org.gradle.api.Project项目脚本, org.gradle.api.initialization.Settings用于设置脚本和org.gradle.api.invocation.Gradle的init脚本.

让脚本实例实现应该配置的模型对象的核心Gradle接口很方便,因为它使模型对象API立即可用于脚本主体,但这也是一个谎言,每当脚本实例执行时,它都会引起各种麻烦.脚本本身被用来代替模型对象,项目脚本不是正确的Project实例,仅因为它实现了核心的Project接口,设置和初始化脚本也是如此.

在6.0中,所有Kotlin DSL脚本都被编译为实现新引入的org.gradle.kotlin.dsl.KotlinScript接口的类,并且相应的模型对象现在可以用作脚本主体中的隐式接收器 . 换句话说,项目脚本的行为就像脚本的主体被包含在with(project) { …​ }块中一样,而设置脚本的行为就像脚本的主体被包含在with(settings) { …​ }块和一个初始化脚本,就好像脚本的主体包含在with(gradle) { …​ }块中一样. 这意味着相应的模型对象也可作为脚本主体的属性,该project属性项目脚本时, settings属性设置脚本和gradle为init脚本属性.

作为更改的一部分, SettingsScriptApi接口不再由设置脚本实现,并且InitScriptApi接口不再由初始化脚本实现. 应该将它们替换为相应的模型对象接口SettingsGradle .

Javadoc and Groovydoc don’t include timestamps by default

Timestamps in the generated documentation have very limited practical use, however they make it impossible to have repeatable documentation builds. Therefore, the Javadoc and Groovydoc tasks are now configured to not include timestamps by default any more.

User provided 'config_loc' properties are ignored by Checkstyle

运行Checkstyle时,Gradle始终将configDirectory用作'config_loc'的值.

New Tooling API progress event

在Gradle 6.0中,我们引入了一个新的progress事件( org.gradle.tooling.events.test.TestOutputEvent )以公开测试执行的输出. 此新事件违反了具有StartEvent - FinisEvent对来表示进度的约定. TaskOutputEvent是一个简单的ProgressEvent .

Changes to the task container behavior

现在,任务容器上的以下不推荐使用的方法会导致错误:

  • TaskContainer.add()

  • TaskContainer.addAll()

  • TaskContainer.remove()

  • TaskContainer.removeAll()

  • TaskContainer.retainAll()

  • TaskContainer.clear()

  • TaskContainer.iterator().remove()

此外,以下不推荐使用的功能现在会导致错误:

  • 替换已经实现的任务.

  • 用不兼容的类型替换已注册(未实现)的任务. 兼容类型是注册类型的相同类型或子类型.

  • 替换从未注册的任务.

Methods on DefaultTask and ProjectLayout replaced with ObjectFactory

使用ObjectFactory.fileProperty()代替现在已删除的以下方法:

  • DefaultTask.newInputFile()

  • DefaultTask.newOutputFile()

  • ProjectLayout.fileProperty()

使用ObjectFactory.directoryProperty()代替现在已删除的以下方法:

  • DefaultTask.newInputDirectory()

  • DefaultTask.newOutputDirectory()

  • ProjectLayout.directoryProperty()

Annotation @Nullable has been removed

org.gradle.api.Nullable注释类型已被删除. 请改用JSR-305的javax.annotation.Nullable .

The FindBugs plugin has been removed

不推荐使用的FindBugs插件已被删除. 或者,您可以使用Gradle插件门户中SpotBugs插件 .

The JDepend plugin has been removed

不推荐使用的JDepend插件已被删除. Gradle插件门户上有许多社区提供的用于代码和体系结构分析的插件 .

The OSGI plugin has been removed

不推荐使用的OSGI插件已被删除. Gradle插件门户上有许多社区提供的OSGI插件.

The announce and build-announcements plugins have been removed

不推荐使用的announce和build-announcements插件已被删除. Gradle插件门户上有许多社区提供的用于发送通知的插件 .

The Compare Gradle Builds plugin has been removed

不推荐使用的Compare Gradle Builds插件已被删除. 请使用构建扫描进行构建分析和比较.

The Play plugins have been removed

不推荐使用的Play插件已被删除. 可从插件门户网站获得外部替代品Play Framework插件 .

Method AbstractCompile.compile() method has been removed

抽象方法compile()不再由AbstractCompile声明.

扩展AbstractCompile任务可以使用其选择的名称来实现自己的@TaskAction方法.

他们还可以自由地使用InputChanges参数添加以@TaskAction注释的方法,而不必也实现无参数方法.

Other Deprecated Behaviors and APIs

  • org.gradle.util.GUtil.savePropertiesNoDateComment已被删除. 此内部方法没有公共替代方法.

  • 不推荐使用的类org.gradle.api.tasks.compile.CompilerArgumentProvider已删除. 请改用org.gradle.process.CommandLineArgumentProvider .

  • 不推荐使用的类org.gradle.api.ConventionProperty已被删除. 使用提供程序而不是约定属性.

  • 不推荐使用的类org.gradle.reporting.DurationFormatter已删除.

  • 返回了TaskInputs的桥接方法org.gradle.api.tasks.TaskInputs.property(String name, @Nullable Object value)已被删除. 必须使用Gradle 4.3编译使用该方法的插件才能在Gradle 6.0上运行.

  • The following setters have been removed from JacocoReportBase:

  • JacocoTaskExtensionappend属性已被删除. 现在,对于Jacoco代理, append始终配置为true.

  • JacocoPlugin上的configureDefaultOutputPathForJacocoMerge方法已被删除. 该方法从未打算公开.

  • 耳插件的部署描述符文件名中的文件路径不再被允许. 请使用简单名称,例如application.xml .

  • org.gradle.testfixtures.ProjectBuilder构造函数已被删除. 请改用ProjectBuilder.builder() .

  • 启用增量Groovy编译后 ,错误的源根配置或为Groovy启用Java注释现在使构建失败. 在这些情况下要进行编译时,请禁用增量Groovy编译.

  • ComponentSelectionRule不再可以注入元数据或常春藤描述符. 请改用ComponentSelection参数上的方法.

  • 现在,在不声明输出的情况下声明增量任务是一个错误. 声明文件输出或改用TaskOutputs.upToDateWhen() .

  • JavaCompileScalaCompile任务中删除了getEffectiveAnnotationProcessorPath()方法.

  • 现在,在任务开始执行后,使用Property<T>类型更改任务属性的值会导致错误.

  • SourceSetOutput删除了isLegacyLayout()方法.

  • TaskInputs.getProperties()返回的映射现在不可修改. 尝试对其进行修改将导致抛出UnsupportedOperationException .

  • 在5.6中引入的孵化功能解析 API进行了细微更改,以允许基于变体名称进行变体选择

Upgrading from 5.5 and earlier

Deprecations

Changing the contents of ConfigurableFileCollection task properties after task starts execution

当任务属性的类型为ConfigurableFileCollection ,一旦任务开始执行,该属性引用的文件集合将忽略对该集合内容所做的更改. 这有两个好处. 首先,这可以防止在任务执行期间意外更改属性值,这可能导致Gradle进行最新检查并使用与任务操作使用的值不同的值来构建缓存查找. 其次,这提高了性能,因为Gradle可以一次计算值并缓存结果.

这将成为Gradle 6.0中的错误.

Creating SignOperation instances

现在不SignOperation直接创建SignOperation实例. 而是应使用SigningExtension的方法创建这些实例.

这将成为Gradle 6.0中的错误.

Declaring an incremental task without outputs

现在不建议声明增量任务而不声明输出. 声明文件输出或改用TaskOutputs.upToDateWhen() .

这将成为Gradle 6.0中的错误.

Method WorkerExecutor.submit() is deprecated

现在不推荐使用WorkerExecutor.submit()方法. 现在应该使用新的noIsolation()classLoaderIsolation()processIsolation()方法提交工作. 见的userguide上使用这些方法的详细信息.

在Gradle 7.0中将删除WorkerExecutor.submit() .

Potential breaking changes

Task dependencies are honored for task @Input properties whose value is a Property

以前,对于类型为Property<T>任务@Input属性,将忽略任务依赖项. 现在,这些已被接受,因此可以将任务输出属性附加到任务@Input属性.

这可能会在任务依赖关系图中引入意外的周期,在该图中,输出属性的值将被映射以产生输入属性的值.

Declaring task dependencies using a file Provider that does not represent a task output

以前,可以将Task.dependsOn()任务输出的Provider<File>Provider<RegularFile>Provider<Directory>实例传递给Task.dependsOn() . 这些提供程序将被默默忽略.

现在这是一个错误,因为Gradle不知道如何生成不是任务输出的文件.

请注意 ,仍有可能传递给Task.dependsOn()一个返回文件并表示任务输出的Provider ,例如myTask.dependsOn(jar.archiveFile)myTask.dependsOn(taskProvider.flatMap { it.outputDirectory }) ,当Provider是任务的带注释的@OutputFile@OutputDirectory属性时.

Setting Property value to null uses the property convention

以前,调用Property.set(null)始终会将属性的值重置为"未定义". 现在,将使用convention()方法与该属性相关联的convention()来确定属性的值.

Enhanced validation of names for publishing.publications and publishing.repositories

存储库名称和发布名称用于构造要发布的任务名称. 可以提供一个名称,该名称将导致无效的任务名称. 出版物和存储库的名称现在限制为[A-Za-z0-9_\\-.]+ .

Restricted Worker API classloader and process classpath

Gradle现在可以防止内部依赖项(例如Guava)泄漏到Worker API操作使用的类路径中. 这解决了工作者需要使用Gradle内部也使用的依赖项的问题 .

在以前的版本中,可能依赖于这些泄漏的类. 现在,依赖此行为的插件将失败. 要修复插件,工作程序应在其类路径中明确包含所有必需的依赖项.

Default PMD version upgraded to 6.15.0

默认情况下,PMD插件已升级为使用PMD版本6.15.0而不是6.8.0.

wreulicke贡献

Configuration copies have unique names

以前,配置的所有副本始终具有名称<OriginConfigurationName>Copy . 现在,当创建多个副本时,通过从第二个副本开始添加索引,每个副本将具有唯一的名称. (例如CompileOnlyCopy2

Changed classpath filtering for Eclipse

Gradle 5.6不再在Eclipse模型中提供自定义类路径属性. 相反,它提供了Eclipse测试源的属性. 此更改需要Buildship 3.1.1或更高版本.

Embedded Kotlin upgraded to 1.3.41

使用kotlin-dsl插件编写的Gradle Kotlin DSL脚本和Gradle插件现在使用Kotlin 1.3.41进行编译.

请参阅Kotlin 博客文章changelog以获取有关所包含更改的更多信息.

现在支持的最低Kotlin Gradle插件版本为1.2.31. 以前是1.2.21.

Automatic capability conflict resolution

在功能冲突的情况下,Gradle的早期版本将自动选择具有最高功能版本的模块. 从5.6开始,这是一种可以选择使用以下行为激活的行为:

configurations.all {
   resolutionStrategy.capabilitiesResolution.all { selectHighestVersion() }
}

有关更多选项,请参见文档的功能部分 .

File removal operations don’t follow symlinked directories

当Gradle由于各种原因不得不删除任务的输出文件时,它将不会遵循符号链接目录. 符号链接本身将被删除,但链接目录的内容将保持不变.

Disabled debug argument parsing in JavaExec

Gradle 5.6引入了新的DSL元素( JavaForkOptions.debugOptions(Action<JavaDebugOptions>) ),以配置派生Java进程的调试属性. 由于此更改,Gradle不再解析与调试相关的JVM参数. 因此,如果-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 JavaForkOptions.getDebu()不再返回true -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005为该进程指定了-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005参数.

Scala 2.9 and Zinc compiler

Gradle不再支持使用Scala 2.9构建应用程序.

Upgrading from 5.4 and earlier

Deprecations

Play

内置的Play插件已被弃用,将由插件门户提供的新的Play Framework插件取代.

Build Comparison

构建比较插件已被弃用,并将在下一个主要版本的Gradle中删除.

构建扫描显示了对构建的更深入了解,您可以使用Gradle Enterprise直接比较两个构建的构建扫描.

Potential breaking changes

User supplied Eclipse project names may be ignored on conflict

即使在名称引起冲突和导入/同步错误的情况下,在所有情况下,Gradle和Buildship都会通过EclipseProject.setName(…​)配置的项目名称受到尊重.

如果这些名称与Eclipse工作区中的其他项目名称冲突,那么Gradle现在可以对这些名称进行重复数据删除. 对于具有用户指定名称的项目,这可能导致不同的Eclipse项目名称.

要利用此行为,需要即将推出的Buildship 3.1.1版本.

Embedded Ant version upgraded to 1.9.14

与摇篮分发的Ant版本已经升级到了14年9月1日从1.9.13.

Type DependencyHandler now statically exposes ExtensionAware

这会影响Kotlin DSL构建脚本,该脚本使用ExtensionAware扩展成员,例如dependencies {}块内的extra属性访问器. 这些成员的接收者将不再是封闭的Project实例,而是dependencies对象本身,即最里面符合ExtensionAware接收器. 为了解决dependencies {}Project额外属性,接收者必须经过显式限定,即project.extra而不是extra . 受影响的扩展还包括the<T>()configure<T>(T.() → Unit) .

Improved processing of dependency excludes

当存在大量排除项时,在某些复杂的依赖图中,Gradle的早期版本可能会产生错误的结果或随机的依赖顺序. 为了减轻这种情况,已经计算了计算排除的算法. 在少数情况下,由于正确性的变化,这可能会导致分辨率有所不同.

Improved classpath separation for worker processes

使用PROCESS隔离时,由Worker API启动的worker守护程序的系统类路径已减少为Gradle基础结构的最小集合. 用户代码仍被隔离到单独的类加载器中,以将其与Gradle运行时隔离. 对于使用worker API的任务,这应该是透明的更改,但是Gradle的早期版本在worker进程中混合了用户代码和Gradle内部. 依赖java.class.path系统属性之类的工作程序操作可能会受到影响,因为java.class.path现在仅表示Gradle内部结构的类路径.

Upgrading from 5.3 and earlier

Deprecations

Using custom local build cache implementations

现在不建议将自定义生成缓存实现用于本地生成缓存. 唯一允许的类型将是DirectoryBuildCache向前. 使用自定义生成缓存实现作为远程生成缓存的支持没有变化.

Potential breaking changes

Use HTTPS when configuring Google Hosted Libraries via googleApis()

可通过JavaScriptRepositoriesExtension#GOOGLE_APIS_REPO_URL访问的Google托管库URL已更改为使用HTTPS协议. 更改还会影响通过googleApis()配置的Ivy存储库.

Upgrading from 5.2 and earlier

Potential breaking changes

Bug fixes in platform resolution

从Gradle 5.0到5.2.1(包括)存在一个错误,其中强制平台可能包含依赖性而不是约束. 每当一个POM文件中定义(通过既依赖关系和"约束"这会发生<dependencyManagement>并且您使用enforcedPlatform . Gradle 5.3修复了此错误,这意味着如果您依赖此无效行为,则分辨率结果可能会有所不同. 类似地,Gradle 5.3将不再尝试下载jar来获取platformenforcedPlatform依赖关系(因为它们只能带来约束).

Automatic target JVM version

如果您使用任何Java插件,Gradle现在将尽力选择与正在编译的模块的目标兼容性相匹配的依赖项. 实际上,这意味着如果您具有为Java 8构建的模块A和为Java 8构建的模块B,则没有任何变化. 但是,如果B是为Java 9+构建的,则它不再与二进制兼容,并且Gradle会抱怨如下错误消息:

Unable to find a matching variant of project :producer:
  - Variant 'apiElements' capability test:producer:unspecified:
      - Required org.gradle.dependency.bundling 'external' and found compatible value 'external'.
      - Required org.gradle.jvm.version '8' and found incompatible value '9'.
      - Required org.gradle.usage 'java-api' and found compatible value 'java-api-jars'.
  - Variant 'runtimeElements' capability test:producer:unspecified:
      - Required org.gradle.dependency.bundling 'external' and found compatible value 'external'.
      - Required org.gradle.jvm.version '8' and found incompatible value '9'.
      - Required org.gradle.usage 'java-api' and found compatible value 'java-runtime-jars'.

通常,这表明您的项目配置错误并且您的依赖项不兼容. 但是,在某些情况下,您仍然可能想要这样做,例如,当模块的类的子集实际上实际上需要Java 9依赖项,并且不打算在早期版本中使用时. Java通常不鼓励您这样做(您应该拆分模块),但是如果遇到此问题,可以通过在使用者方面禁用此新行为来解决:

java {
   disableAutoTargetJvm()
}

Bug fix in Maven / Ivy interoperability with dependency substitution

如果您有一个Maven依赖项指向一个Ivy依赖项,其中default配置依赖项与compile + runtime + master不匹配, 并且该Ivy依赖项已被替换(使用resolutionStrategy.forceresolutionStrategy.eachDependencyresolutionStrategy.dependencySubstitution ),则此修复程序会影响你的. Gradle在5.0之前的传统行为仍然存在,而不是被改进的pom支持所引入的更改所取代.

在存在连接点和符号链接的情况下,Gradle不再忽略Windows上的clean任务,所有Delete任务和project.delete {}操作的followSymlink选项.

Fix in publication of additional artifacts

在以前的Gradle版本中,除非在项目配置中注册的其他工件还作为工件添加到发布配置中,否则它们不会通过maven-publishivy-publish .

使用Gradle 5.3,现在可以正确解释和发布这些工件了.

这意味着在项目发布(Ivy或Maven)上都注册的工件会导致发布失败,因为它将创建重复的条目. 解决方法是从发布配置中删除这些工件.

Upgrading from 5.0 and earlier

Deprecations

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

    validateTaskProperties.getClasses().setFrom(fileCollection)
    validateTaskProperties.getClasspath().setFrom(fileCollection)

Potential breaking changes

以前不建议以下更改:

Signing API changes

现在分别通过Signature.getToSign()Signature.getFile()跟踪Sign任务的输入和输出文件.

Collection properties default to empty collection

在Gradle 5.0中,使用ObjectFactory创建的collection属性实例将没有定义任何值,要求插件作者明确设置初始值. 事实证明这很尴尬且容易出错,因此ObjectFactory现在返回带有空集合作为其初始值的实例.

Worker API: working directory of a worker can no longer be set

由于JDK 11不再支持更改正在运行的进程的工作目录,因此现在禁止通过其fork选项设置工作程序的工作目录. 现在,所有工作人员都使用相同的工作目录来启用重用. 请改为将文件和目录作为参数传递. 请参阅Worker API文档中的示例.

Changes to native linking tasks

为了扩展我们惯用的Provider API做法,此更改会影响org.gradle.nativeplatform.tasks.LinkSharedLibrary的安装名称属性.

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

  • setInstallName(String)已删除. 使用Property.set()代替.

Passing arguments to Windows Resource Compiler

To expand our idiomatic Provider API practices, the WindowsResourceCompile task has been converted to use the Provider API.

现在,传递其他编译器参数的方式与CppCompile和其他任务的方式相同.

Copied configuration no longer shares a list of beforeResolve actions with original

beforeResolve操作的列表不再在复制的配置和原始配置之间共享. 而是,复制的配置会beforeResolve复制时收到beforeResolve操作的副本. 复制(复制到任一配置)后添加的任何beforeResolve操作将不会在原始副本和副本之间共享. 这可能会破坏依赖于先前行为的插件.

Changes to incubating POM customization types

  • MavenPomDeveloper.properties的类型已从Property<Map<String, String>>更改为MapProperty<String, String> .

  • MavenPomContributor.properties的类型已从Property<Map<String, String>>更改为MapProperty<String, String> .

Changes to specifying operating system for native projects

The incubating operatingSystems property on native components has been replaced with the targetMachines property.

Changes for archive tasks (Zip, Jar, War, Ear, Tar)

Change in behavior for tasks extending AbstractArchiveTask

使用提供者APIAbstractArchiveTask具有几个新属性. 扩展这些类型并从基类覆盖方法的插件可能不再具有相同的行为. 在内部, AbstractArchiveTask首选新属性,而诸如getArchiveName()类的方法是新属性的外观.

如果您的插件/构建仅使用这些类型(而不扩展它们),则没有任何改变.