将构建从 Gradle 5.x 升级到 6.0
本章提供将 Gradle 5.x 构建迁移到 Gradle 6.0 所需的信息。要从 Gradle 4.x 迁移,请先完成4.x 到 5.0 指南。
我们建议所有用户执行以下步骤:
-
尝试运行
gradle help --scan
并查看生成的构建扫描的弃用视图。这样您就可以看到适用于您的构建的任何弃用警告。
或者,您可以运行
gradle help --warning-mode=all
以在控制台中查看弃用信息,尽管它可能不会报告那么多详细信息。 -
更新您的插件。
一些插件将与这个新版本的 Gradle 兼容,例如因为它们使用已删除或更改的内部 API。当插件尝试使用 API 的已弃用部分时,上一步将通过发出弃用警告来帮助您识别潜在问题。
-
运行
gradle wrapper --gradle-version 6.0
将项目更新到6.0。 -
尝试运行该项目并使用故障排除指南调试任何错误。
从 5.6 及更早版本升级
弃用
不应再使用compile
和runtime
配置来声明依赖关系
自Gradle 3.4起,不鼓励在 Java 生态系统插件中使用compile
和配置。runtime
这些配置用于编译和运行main
源集中的代码。其他源集创建类似的配置(例如testCompile
,testRuntime
对于test
源集),也不应该使用。 、和配置应该用于声明依赖关系,并且implementation
和配置应该用于解决依赖关系。查看这些配置的关系。api
compileOnly
runtimeOnly
compileClasspath
runtimeClasspath
旧版发布系统已弃用并由*-publish
插件取代
该uploadArchives
任务和maven
插件已弃用。
用户应该使用或插件迁移到 Gradle 的发布系统。这些插件自 Gradle 4.8 以来一直稳定。maven-publish
ivy-publish
发布系统也是保证Gradle模块元数据发布的唯一途径。
任务问题会发出弃用警告
当 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 http://gradle.github.net.cn/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 behavior is scheduled to be removed in Gradle 7.0.
Property 'outputFile' is not annotated with an input or output annotation. This behavior is scheduled to be removed in Gradle 7.0.
如果您拥有相关任务的代码,则可以按照建议修复它们。您还可以使用它--stacktrace
来查看每个警告在代码中的来源。
否则,您需要将问题报告给相关任务或插件的维护者。
用于增量任务的旧 APIIncrementalTaskInputs
已弃用
在 Gradle 5.4 中,我们引入了一个用于实现增量任务的新 API :InputChanges。基于的旧 APIIncrementalTaskInputs
已被弃用。
向上搜索相关 APIStartParameter
已被弃用
在 Gradle 5.0 中,我们删除了--no-search-upward
CLI 参数。
StartParameter
(例如)中的相关 APIisSearchUpwards()
现已弃用。
APIBuildListener.buildStarted
已Gradle.buildStarted
被弃用
这些方法目前无法按预期工作,因为在构建开始后永远不会调用回调。
为了避免混淆,这些方法已被弃用。
Copy
已弃用隐式重复策略或存档任务
归档任务Tar
,Zip
默认情况下允许同一路径的多个条目存在于创建的归档中。这可能会导致“严重无效的 zip 文件”,从而触发 zip 炸弹检测。
为了防止这种情况意外发生,创建存档时遇到重复项现在会生成一条弃用消息,并且从 Gradle 7.0 开始将使构建失败。
Copy
任务也很乐意将具有相同相对路径的多个源复制到目标目录。此行为也已被弃用。
如果你想允许重复,你可以明确指定:
task archive(type: Zip) {
duplicatesStrategy = DuplicatesStrategy.INCLUDE // allow duplicates
...
}
不推荐在没有设置文件的情况下执行 Gradle
settings.gradle[.kts]
Gradle 构建由当前目录或父目录中的文件定义。如果没有设置文件,Gradle 构建是未定义的,并且会发出弃用警告。
在 Gradle 7.0 中,Gradle 仅允许您使用未定义的构建调用init
任务或诊断命令行标志,例如--version
。
调用Project.afterEvaluate
已评估的项目已被弃用
评估项目后,Gradle 会忽略传递给的所有配置Project#afterEvaluate
并发出弃用警告。这种情况在 Gradle 7.0 中将成为错误。
潜在的重大变化
不再支持 Android Gradle Plugin 3.3 及更早版本
Gradle 6.0 支持 Android Gradle 插件版本 3.4 及更高版本。
不再支持构建扫描插件 2.x
对于 Gradle 6,构建扫描插件的使用必须替换为 Develocity 插件。这还需要更改插件的应用方式。请参阅https://gradle.com/help/gradle-6-build-scan-plugin了解更多信息。
更新捆绑的 Gradle 依赖项
-
Groovy 已更新至Groovy 2.5.8。
-
Kotlin 已更新至Kotlin 1.3.50。
-
Ant 已更新至Ant 1.10.7。
更新默认集成版本
-
Checkstyle 已更新至Checkstyle 8.24。
-
CodeNarc 已更新至CodeNarc 1.4。
-
PMD 已更新至PMD 6.17.0。
-
JaCoCo 已更新至0.8.5。叶夫根尼·曼德里科夫贡献
复合构建中构建和任务名称的更改
以前,Gradle 使用根项目的名称作为包含的构建的构建名称。现在,使用构建根目录的名称,如果不同,则不考虑根项目名称。如果通过设置文件包含构建,则可以为构建指定不同的名称。
includeBuild("some-other-build") {
name = "another-name"
}
之前的行为是有问题的,因为它导致在构建过程中的不同时间使用不同的名称。
buildSrc 现在保留为项目和子项目构建名称
以前,Gradle 并不阻止使用名称“buildSrc”作为多项目构建的子项目或作为包含的构建的名称。现在,这是不允许的。 “buildSrc”这个名称现在保留给构建额外构建逻辑的传统 buildSrc 项目。
buildSrc 的典型使用不受此更改的影响。仅当您的设置文件指定include("buildSrc")
或 时,您才会受到影响includeBuild("buildSrc")
。
Scala Zinc 编译器
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 实现。
本地构建缓存始终是目录缓存
过go,可以使用任何构建缓存实现作为local
缓存。不再允许这样做,因为本地缓存必须始终是DirectoryBuildCache
.
BuildCacheConfiguration.local(Class)
使用除 as 类型之外的任何内容进行调用DirectoryBuildCache
都会导致构建失败。使用该类型调用这些方法DirectoryBuildCache
将产生弃用警告。
使用getLocal()
andlocal(Action)
代替。
无法打包或解包缓存结果现在将使构建失败
过go,当 Gradle 在打包缓存任务的结果时遇到问题时,Gradle 会忽略该问题并继续运行构建。
当遇到损坏的缓存工件时,Gradle 会删除已解压的所有内容并重新执行任务,以确保构建有机会成功。
虽然此行为的目的是使构建成功,但这会产生隐藏问题的不利影响并导致缓存性能降低。
在 Gradle 6.0 中,打包和解包错误都会导致构建失败,这样这些问题就会更容易显现出来。
buildSrc 项目自动使用构建缓存配置
以前,为了在 buildSrc 构建中使用构建缓存,您需要在 buildSrc 构建中复制构建缓存配置。现在,它自动使用顶级设置脚本定义的构建缓存配置。
Gradle 模块元数据始终发布
Gradle 模块元数据在 Gradle 5.3 中正式引入,旨在解决多年来困扰依赖管理的许多问题,特别是(但不仅限于)Java 生态系统中的问题。
在 Gradle 6.0 中,默认启用 Gradle 模块元数据。
这意味着,如果您使用 Gradle 并使用maven-publish或ivy-publish插件发布库,则除了传统元数据之外,还始终会发布 Gradle 模块元数据文件。
传统的元数据文件将包含一个标记,以便 Gradle 知道还有其他元数据可供使用。
Gradle 模块元数据具有更严格的验证
发布 Gradle 模块元数据时会验证以下规则:
-
变体名称必须是唯一的,
-
每个变体必须至少有一个属性,
-
两个变体不可能具有完全相同的属性和功能,
-
如果存在依赖关系,则所有变体中至少有一个必须携带版本信息。
这些也记录在规范中。
默认情况下,不再查询 Maven 或 Ivy 存储库来查找没有元数据的工件
如果 Gradle 无法在本节中定义的存储库中找到模块的元数据文件(.pom
或) ,它现在假设该模块不存在于该存储库中。ivy.xml
repositories { }
对于动态版本,maven-metadata.xml
相应模块的 需要存在于 Maven 存储库中。
以前,Gradle 还会查找默认工件 ( .jar
)。当使用多个存储库时,这种行为通常会导致大量不必要的请求,从而减慢构建速度。
artifact()
您可以通过添加元数据源来选择所选存储库的旧行为。
更改 pompackaging
属性不再更改工件扩展
以前,如果 pom 打包不是jar、ejb、bundle或maven-plugin,则发布到 Maven 存储库的主工件的扩展名会在发布过程中更改以匹配 pom 打包。
此行为导致 Gradle 模块元数据损坏,并且由于处理不同的打包类型而难以理解。
构建作者可以在创建工件时更改工件名称,以获得与以前相同的结果 - 例如,通过jar.archiveExtension.set(pomPackaging)
显式设置。
已ivy.xml
发布的 Java 库包含更多信息
进行了许多修复以ivy.xml
在ivy-publish
插件中生成更正确的元数据。
结果,ivy.xml
文件的内部结构发生了变化。配置runtime
现在包含更多信息,对应于Java 库的runtimeElements变体。配置default
应该产生与以前相同的结果。
一般来说,建议用户迁移ivy.xml
到新的 Gradle 模块元数据格式。
buildSrc
设置脚本不再可见来自的类
以前,buildSrc 项目是在应用项目的设置脚本之前构建的,并且其类在脚本中可见。现在,buildSrc 是在设置脚本之后构建的,并且它的类对其不可见。 buildSrc 类对项目构建脚本和脚本插件仍然可见。
通过声明外部依赖关系,可以从设置脚本中使用自定义逻辑。
设置脚本中的块pluginManagement
现已隔离
以前,pluginManagement {}
设置脚本内的任何块都是在脚本正常执行期间执行的。
buildscript {}
现在,它们以与or类似的方式提前执行plugins {}
。这意味着此类块内的代码无法引用脚本中其他地方声明的任何内容。
进行此更改后,pluginManagement
在解析设置脚本本身的插件时也可以应用配置。
设置脚本中加载的插件和类对项目脚本可见,并且buildSrc
以前,通过使用添加到设置脚本的任何类buildscript {}
在脚本外部都是不可见的。现在,它们对所有项目构建脚本都是可见的。
它们对于buildSrc
构建脚本及其设置脚本也是可见的。
进行此更改是为了使应用于设置脚本的插件可以为整个构建贡献逻辑。
插件验证更改
-
该
validateTaskProperties
任务现已弃用,请改用validatePlugins
。新名称更好地反映了这样一个事实:它还验证工件转换参数和其他非属性定义。 -
类型
ValidateTaskProperties
被替换为ValidatePlugins
. -
现在该
setClasses()
方法已被删除。代替使用getClasses().setFrom()
。 -
该
setClasspath()
方法也被删除。代替使用getClasspath().setFrom()
。 -
现在默认启用failOnWarning选项。
-
现在,以下任务验证错误会导致运行时构建失败,并升级为ValidatePlugins的错误:
-
任务属性使用任务不允许的属性注释进行注释,例如
@InputArtifact
.
-
现在使用该embedded-kotlin
插件需要一个存储库
就像使用kotlin-dsl
插件时一样,现在需要声明一个存储库,如果您应用该embedded-kotlin
插件,则可以在其中找到 Kotlin 依赖项。
plugins {
`embedded-kotlin`
}
repositories {
mavenCentral()
}
Kotlin DSL IDE 支持现在需要 Kotlin IntelliJ 插件 >= 1.3.50
对于 1.3.50 之前的 Kotlin IntelliJ 插件版本,当Gradle JVM设置为与Project SDK中的版本不同时,Kotlin DSL 脚本将被错误突出显示。只需将 IDE 插件升级到版本 >= 1.3.50 即可恢复正确的 Kotlin DSL 脚本突出显示行为。
Kotlin DSL 脚本基本类型不再扩展Project
,Settings
或者Gradle
在以前的版本中,Kotlin DSL 脚本被编译为实现三个核心 Gradle 配置接口之一的类,以便隐式地将其 API 公开给脚本。org.gradle.api.Project
对于项目脚本、org.gradle.api.initialization.Settings
设置脚本和org.gradle.api.invocation.Gradle
初始化脚本。
让脚本实例实现它应该配置的模型对象的核心 Gradle 接口很方便,因为它使模型对象 API 立即可用于脚本主体,但这也是一个谎言,每当脚本本身代替了模型对象,项目脚本并不是一个合适的Project
实例,因为它实现了核心Project
接口,设置和初始化脚本也是如此。
在 6.0 中,所有 Kotlin DSL 脚本都被编译为实现新引入的org.gradle.kotlin.dsl.KotlinScript
接口的类,并且相应的模型对象现在可用作脚本主体中的隐式接收器。换句话说,项目脚本的行为就像脚本的主体包含在with(project) { … }
块中一样,设置脚本的行为就像脚本的主体包含在with(settings) { … }
块中一样,而 init 脚本的行为就像脚本的主体包含在块中一样。一个with(gradle) { … }
块。这意味着相应的模型对象也可用作脚本主体中的属性、project
项目脚本的属性、settings
设置脚本的属性和gradle
初始化脚本的属性。
作为更改的一部分,该SettingsScriptApi
界面不再由设置脚本实现,并且该InitScriptApi
界面也不再由 init 脚本实现。它们应该替换为相应的模型对象接口,Settings
并且Gradle
.
默认情况下,Javadoc 和 Groovydoc 不包含时间戳
生成的文档中的时间戳的实际用途非常有限,但是它们使得不可能进行可重复的文档构建。因此,Javadoc
和Groovydoc
任务现在被配置为默认不再包含时间戳。
Checkstyle 忽略用户提供的“config_loc”属性
运行 Checkstyle 时, Gradle 始终使用configDirectory
“config_loc”的值。
新工具 API 进度事件
在 Gradle 6.0 中,我们引入了一个新的进度事件 ( org.gradle.tooling.events.test.TestOutputEvent ) 来公开测试执行的输出。这个新事件打破了用“ StartEvent
- FinishEvent
”来表示进度
的惯例。TaskOutputEvent
是一个简单的ProgressEvent
。
任务容器行为的更改
任务容器上的以下已弃用的方法现在会导致错误:
-
TaskContainer.add()
-
TaskContainer.addAll()
-
TaskContainer.remove()
-
TaskContainer.removeAll()
-
TaskContainer.retainAll()
-
TaskContainer.clear()
-
TaskContainer.iterator().remove()
此外,以下已弃用的功能现在会导致错误:
-
替换已经实现的任务。
-
用不兼容的类型替换已注册(未实现)的任务。兼容类型是已注册类型的相同类型或子类型。
-
替换从未注册过的任务。
方法 onDefaultTask
并ProjectLayout
替换为ObjectFactory
使用ObjectFactory.fileProperty()
现在已删除的以下方法来代替:
-
DefaultTask.newInputFile()
-
DefaultTask.newOutputFile()
-
ProjectLayout.fileProperty()
使用ObjectFactory.directoryProperty()
现在已删除的以下方法来代替:
-
DefaultTask.newInputDirectory()
-
DefaultTask.newOutputDirectory()
-
ProjectLayout.directoryProperty()
注释@Nullable
已被删除
注释org.gradle.api.Nullable
类型已被删除。请javax.annotation.Nullable
改用 JSR-305。
FindBugs 插件已被删除
已弃用的 FindBugs 插件已被删除。作为替代方案,您可以使用Gradle 插件门户中的SpotBugs 插件。
JDepend 插件已被删除
已弃用的 JDepend 插件已被删除。Gradle 插件门户上提供了许多社区提供的用于代码和架构分析的插件。
OSGI插件已被删除
已弃用的 OSGI 插件已被删除。Gradle 插件门户上提供了许多社区提供的 OSGI 插件。
公告和构建公告插件已被删除
已弃用的公告和构建公告插件已被删除。Gradle 插件门户上有许多社区提供的用于发送通知的插件。
Compare Gradle Builds 插件已被删除
已弃用的 Compare Gradle Builds 插件已被删除。请使用构建扫描进行构建分析和比较。
Play 插件已被删除
已弃用的 Play 插件已被删除。可以从插件门户获取外部替代品Play Framework 插件。
方法AbstractCompile.compile()
方法已被删除
抽象方法compile()
不再由 声明AbstractCompile
。
扩展的任务可以使用自己选择的名称来AbstractCompile
实现自己的方法。@TaskAction
他们还可以自由添加@TaskAction
使用InputChanges
参数注释的方法,而无需实现无参数方法。
其他已弃用的行为和 API
-
已
org.gradle.util.internal.GUtil.savePropertiesNoDateComment
被删除。此内部方法没有公共替代方法。 -
已弃用的类
org.gradle.api.tasks.compile.CompilerArgumentProvider
已被删除。请改用org.gradle.process.CommandLineArgumentProvider。 -
已弃用的类
org.gradle.api.ConventionProperty
已被删除。使用提供者而不是约定属性。 -
已弃用的类
org.gradle.reporting.DurationFormatter
已被删除。 -
org.gradle.api.tasks.TaskInputs.property(String name, @Nullable Object value)
返回的桥接方法TaskInputs
已被删除。使用该方法的插件必须使用 Gradle 4.3 进行编译才能在 Gradle 6.0 上运行。 -
以下设置器已从 中删除
JacocoReportBase
:-
executionData -
getExecutionData().setFrom()
改为使用。 -
sourceDirectories - 使用
getSourceDirectories().setFrom()
代替。 -
classDirectories - 使用
getClassDirectories().setFrom()
代替。 -
extraClassDirs -
getAdditionalClassDirs().setFrom()
改为使用。 -
extraSourceDirs -
getAdditionalSourceDirs().setFrom()
改为使用。
-
-
append
上的属性已JacocoTaskExtension
被删除。append
现在对于 Jacoco 代理始终配置为 true。 -
configureDefaultOutputPathForJacocoMerge
上的方法已JacocoPlugin
被删除。该方法从来就不是公开的。 -
不再允许ear插件的部署描述符文件名中的文件路径。请使用简单的名称,例如
application.xml
, 。 -
构造
org.gradle.testfixtures.ProjectBuilder
函数已被删除。请改用ProjectBuilder.builder()
。 -
当启用增量 Groovy 编译时,源根的错误配置或为 Groovy 启用 Java 注释现在会导致构建失败。当您想要在这些情况下进行编译时,请禁用增量 Groovy 编译。
-
ComponentSelectionRule
不再可以注入元数据或ivy描述符。请改用ComponentSelection
参数上的方法。 -
现在声明增量任务而不声明输出是一个错误。声明文件输出或使用TaskOutputs.upToDateWhen()代替。
-
该方法已从和任务
getEffectiveAnnotationProcessorPath()
中删除。JavaCompile
ScalaCompile
-
现在,在任务开始执行后使用类型更改任务属性的值
Property<T>
会导致错误。 -
该
isLegacyLayout()
方法已从 中删除SourceSetOutput
。 -
返回的地图
TaskInputs.getProperties()
现在不可修改。尝试修改它会导致UnsupportedOperationException
抛出异常。 -
5.6 中引入的孵化功能解析API略有变化,还允许根据变体名称选择变体
从 5.5 及更早版本升级
弃用
ConfigurableFileCollection
任务开始执行后更改任务属性的内容
当任务属性具有 type 时ConfigurableFileCollection
,一旦任务开始执行,该属性引用的文件集合将忽略对集合内容所做的更改。这有两个好处。首先,这可以防止在任务执行期间意外更改属性值,这可能会导致 Gradle 进行最新检查并使用与任务操作所使用的值不同的值来构建缓存查找。其次,这提高了性能,因为 Gradle 可以计算一次值并缓存结果。
这将成为 Gradle 6.0 中的错误。
方法WorkerExecutor.submit()
已被弃用
该WorkerExecutor.submit()
方法现已弃用。现在应该使用新的noIsolation()
,classLoaderIsolation()
和processIsolation()
方法来提交工作。有关使用这些方法的更多信息,请参阅有关 Worker API 的部分。
WorkerExecutor.submit()
将在 Gradle 8.0 中删除。
潜在的重大变化
@Input
对于值为 a 的任务属性,任务依赖性受到尊重Property
@Input
以前,类型 的任务属性将忽略任务依赖性Property<T>
。现在,这些已得到遵守,因此可以将任务输出属性附加到任务@Input
属性。
这可能会在任务依赖图中引入意外的循环,其中输出属性的值被映射以生成输入属性的值。
Provider
使用不代表任务输出的文件声明任务依赖关系
以前,可以传递不代表任务输出的,或Task.dependsOn()
实例。这些提供商将被默默地忽略。Provider<File>
Provider<RegularFile>
Provider<Directory>
现在这是一个错误,因为 Gradle 不知道如何构建不是任务输出的文件。
请注意,仍然可以传递返回文件并表示任务输出的Task.dependsOn()
a ,例如或,当是任务的带注释或属性时。Provider
myTask.dependsOn(jar.archiveFile)
myTask.dependsOn(taskProvider.flatMap { it.outputDirectory })
Provider
@OutputFile
@OutputDirectory
Property
将值设置为null
使用属性约定
以前,调用Property.set(null)
总是将属性的值重置为“未定义”。现在,使用该方法与属性关联的约定convention()
将用于确定属性的值。
publishing.publications
增强了和 的名称验证publishing.repositories
存储库和发布名称用于构造发布任务名称。提供的名称可能会导致任务名称无效。出版物和存储库的名称现在限制为[A-Za-z0-9_\\-.]+
.
Restricted Worker API 类加载器和进程类路径
Gradle 现在可以防止内部依赖项(如 Guava)泄漏到 Worker API 操作使用的类路径中。这修复了工作人员需要使用 Gradle 内部也使用的依赖项的问题。
在以前的版本中,可以依赖这些泄漏的类。依赖此行为的插件现在将失败。要修复该插件,工作人员应在其类路径中显式包含所有必需的依赖项。
配置副本具有唯一的名称
以前,配置的所有副本始终具有名称<OriginConfigurationName>Copy
。现在,当创建多个副本时,通过从第二个副本开始添加索引,每个副本都将具有唯一的名称。 (例如CompileOnlyCopy2
)
更改了 Eclipse 的类路径过滤
Gradle 5.6 不再在 Eclipse 模型中提供自定义类路径属性。相反,它提供Eclipse 测试源的属性。此更改需要 Buildship 版本 3.1.1 或更高版本。
嵌入式 Kotlin 升级至 1.3.41
Gradle Kotlin DSL 脚本和使用该kotlin-dsl
插件编写的 Gradle 插件现在使用 Kotlin 1.3.41 进行编译。
现在支持的最低 Kotlin Gradle 插件版本是 1.2.31。之前是 1.2.21。
自动能力冲突解决
如果出现功能冲突,以前版本的 Gradle 会自动选择具有最高功能版本的模块。从 5.6 开始,这是一种选择加入行为,可以使用以下方式激活:
configurations.all {
resolutionStrategy.capabilitiesResolution.all { selectHighestVersion() }
}
有关更多选项,请参阅文档的功能部分。
文件删除操作不遵循符号链接目录
当 Gradle 由于各种原因必须删除任务的输出文件时,它不会遵循符号链接目录。符号链接本身将被删除,但链接目录的内容将保持不变。
在 JavaExec 中禁用调试参数解析
Gradle 5.6 引入了一个新的 DSL 元素 ( JavaForkOptions.debugOptions(Action<JavaDebugOptions>)
) 来配置分叉 Java 进程的调试属性。由于此更改,Gradle 不再解析与调试相关的 JVM 参数。因此,如果为进程指定了或参数JavaForkOptions.getDebu()
,则不再返回。true
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
Scala 2.9 和 Zinc 编译器
Gradle 不再支持使用 Scala 2.9 构建应用程序。
从 5.4 及更早版本升级
弃用
玩
内置Play 插件已被弃用,并将被插件门户中提供的新Play Framework 插件取代。
潜在的重大变化
用户提供的 Eclipse 项目名称可能会因冲突而被忽略
在所有情况下,Gradle 和 Buildship 都会尊重通过配置的项目名称EclipseProject.setName(…)
,即使名称导致冲突和导入/同步错误也是如此。
如果这些名称与 Eclipse 工作区中的其他项目名称冲突,Gradle 现在可以删除这些名称的重复项。对于具有用户指定名称的项目,这可能会导致不同的 Eclipse 项目名称。
即将推出的 Buildship 3.1.1 版本需要利用此行为。
嵌入式Ant版本升级至1.9.14
随 Gradle 分发的 Ant 版本已从 1.9.13 升级到1.9.14。
类型DependencyHandler
现在静态公开ExtensionAware
这会影响使用ExtensionAware
扩展成员(例如块extra
内的属性访问器)的 Kotlin DSL 构建脚本dependencies {}
。这些成员的接收者将不再是封闭的Project
实例,而是dependencies
对象本身,即最内部的ExtensionAware
一致接收者。为了解决接收器Project
内部的额外属性,dependencies {}
必须显式限定 ieproject.extra
而不仅仅是extra
.受影响的扩展还包括the<T>()
和configure<T>(T.() → Unit)
。
改进了依赖性排除的处理
在某些复杂的依赖关系图中,当存在大量排除时,以前版本的 Gradle 可能会产生错误的结果或随机的依赖关系顺序。为了缓解这种情况,计算排除的算法已被重写。在极少数情况下,由于正确性的变化,这可能会导致分辨率出现一些差异。
改进了工作进程的类路径分离
使用隔离时由Worker API启动的工作守护进程的系统类路径PROCESS
已减少到 Gradle 基础设施的最小集合。用户代码仍然被隔离到一个单独的类加载器中,以将其与 Gradle 运行时隔离。对于使用工作 API 的任务来说,这应该是一个透明的更改,但以前版本的 Gradle 在工作进程中混合了用户代码和 Gradle 内部。依赖于java.class.path
系统属性等内容的辅助操作可能会受到影响,因为java.class.path
现在仅代表 Gradle 内部的类路径。
从 5.3 及更早版本升级
弃用
使用自定义本地构建缓存实现
现在不推荐使用本地构建缓存的自定义构建缓存实现。唯一允许的类型将是DirectoryBuildCache
前进。对使用自定义构建缓存实现作为远程构建缓存的支持没有变化。
潜在的重大变化
配置 Google 托管库时使用 HTTPSgoogleApis()
可访问的 Google 托管库 URLJavaScriptRepositoriesExtension#GOOGLE_APIS_REPO_URL
已更改为使用 HTTPS 协议。该更改还会影响通过配置的 Ivy 存储库googleApis()
。
从 5.2 及更早版本升级
潜在的重大变化
平台解析中的错误修复
从 Gradle 5.0 到 5.2.1(包含)存在一个错误,其中强制平台可能包含依赖项而不是约束。每当 POM 文件定义依赖项和“约束”(通过<dependencyManagement>
)并且您使用enforcedPlatform
. Gradle 5.3 修复了此错误,这意味着如果您依赖此损坏的行为,解析结果可能会有所不同。同样,Gradle 5.3 将不再尝试下载platform
和enforcedPlatform
依赖项的 jar(因为它们应该只引入约束)。
自动目标JVM版本
如果您应用任何 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:
- Provides org.gradle.dependency.bundling 'external'
- Required org.gradle.jvm.version '8' and found incompatible value '9'.
- Required org.gradle.usage 'java-api' and found value 'java-api-jars'.
- Variant 'runtimeElements' capability test:producer:unspecified:
- Provides org.gradle.dependency.bundling 'external'
- Required org.gradle.jvm.version '8' and found incompatible value '9'.
- Required org.gradle.usage 'java-api' and found value 'java-runtime-jars'.
一般来说,这表明您的项目配置错误并且您的依赖项不兼容。但是,在某些情况下,您可能仍然希望这样做,例如,当您的模块中只有一部分类实际上需要 Java 9 依赖项,并且不打算在早期版本中使用时。一般来说,Java 不鼓励您这样做(您应该拆分您的模块),但如果您遇到此问题,您可以通过在消费者端禁用此新行为来解决问题:
java {
disableAutoTargetJvm()
}
修复 Maven / Ivy 互操作性与依赖项替换中的错误
如果您有一个 Maven 依赖项指向 Ivy 依赖项,其中配置依赖项与+ +项
default
不匹配,并且Ivy 依赖项已被替换(使用,或),那么此修复将对您产生影响。 Gradle 5.0 之前的遗留行为仍然存在,而不是被改进的 pom 支持引入的更改所取代。compile
runtime
master
resolutionStrategy.force
resolutionStrategy.eachDependency
resolutionStrategy.dependencySubstitution
删除操作正确处理 Windows 上的符号链接
Gradle 不再忽略followSymlink
Windows 上存在连接点和符号链接的clean
任务、所有Delete
任务和操作的选项。project.delete {}
修复附加工件的发布
在以前的 Gradle 版本中,在项目级别注册的其他工件不会由maven-publish
或发布,ivy-publish
除非它们也作为工件添加到发布配置中。
在 Gradle 5.3 中,这些工件现在得到了正确的解释和发布。
这意味着在项目和发布(Ivy 或 Maven)上注册的工件将导致发布失败,因为它会创建重复的条目。修复方法是从发布配置中删除这些工件。
从 5.1 及更早版本升级
潜在的重大变化
没有任何
从 5.0 及更早版本升级
弃用
请点击 API 链接了解如何处理这些弃用(如果此处未提供额外信息):
-
设置器 for
classes
和classpath
onorg.gradle.plugin.devel.tasks.ValidateTaskProperties
(已删除) -
不应该有像
ConfigurableFileCollection
.代替使用setFrom
。例如,
validateTaskProperties.getClasses().setFrom(fileCollection) validateTaskProperties.getClasspath().setFrom(fileCollection)
潜在的重大变化
之前未弃用以下更改:
签署 API 变更
现在分别通过和Sign
跟踪任务的输入和输出文件。Signature.getToSign()
Signature.getFile()
集合属性默认为空集合
在 Gradle 5.0 中,使用创建的集合属性实例ObjectFactory
没有定义值,需要插件作者显式设置初始值。事实证明,这很尴尬并且容易出错,因此ObjectFactory
现在返回以空集合作为初始值的实例。
Worker API:无法再设置worker的工作目录
由于 JDK 11 不再支持更改正在运行的进程的工作目录,因此现在禁止通过其 fork 选项设置工作进程的工作目录。所有工作人员现在都使用相同的工作目录以实现重用。请改为传递文件和目录作为参数。请参阅Worker API 文档中的示例。
本机链接任务的更改
为了扩展我们惯用的Provider API实践,安装名称属性org.gradle.nativeplatform.tasks.LinkSharedLibrary
受到此更改的影响。
-
getInstallName()
更改为返回 aProperty
。 -
setInstallName(String)
go掉了。代替使用Property.set()
。
将参数传递给 Windows 资源编译器
为了扩展我们惯用的Provider API实践,该WindowsResourceCompile
任务已转换为使用 Provider API。
CppCompile
现在传递额外的编译器参数遵循与和其他任务相同的模式。
beforeResolve
复制的配置不再与原始配置共享操作列表
beforeResolve
复制的配置和原始配置之间不再共享操作列表。相反,复制的配置beforeResolve
会在进行复制时接收操作的副本。复制后添加的任何beforeResolve
操作(到任一配置)都不会在原始版本和副本之间共享。这可能会破坏依赖先前行为的插件。
孵化 POM 自定义类型的更改
-
的类型
MavenPomDeveloper.properties
已从 更改Property<Map<String, String>>
为MapProperty<String, String>
。 -
的类型
MavenPomContributor.properties
已从 更改Property<Map<String, String>>
为MapProperty<String, String>
。
对本机项目指定操作系统的更改
本机组件上的incubatingoperatingSystems
属性已替换为targetMachines属性。
存档任务的更改 ( Zip
, Jar
, War
, Ear
, Tar
)
任务扩展的行为改变AbstractArchiveTask
使用Provider API具有AbstractArchiveTask
多个新属性。扩展这些类型并重写基类方法的插件可能不再以相同的方式运行。在内部,更喜欢新的属性和方法,比如外观,而不是新的属性。AbstractArchiveTask
getArchiveName()
如果您的插件/构建仅使用这些类型(并且不扩展它们),则没有任何变化。