将构建从 Gradle 6.x 升级到 7.0
本章提供将 Gradle 6.x 构建迁移到 Gradle 7.0 所需的信息。要从 Gradle 5.x 或更早版本迁移,请先完成旧版迁移指南。
我们建议所有用户执行以下步骤:
-
尝试运行
gradle help --scan
并查看生成的构建扫描的弃用视图。这样您就可以看到适用于您的构建的任何弃用警告。
或者,您可以运行
gradle help --warning-mode=all
以在控制台中查看弃用信息,尽管它可能不会报告那么多详细信息。 -
更新您的插件。
一些插件将与这个新版本的 Gradle 兼容,例如因为它们使用已删除或更改的内部 API。当插件尝试使用 API 的已弃用部分时,上一步将通过发出弃用警告来帮助您识别潜在问题。
-
运行
gradle wrapper --gradle-version 7.0
将项目更新到7.0。 -
尝试运行该项目并使用故障排除指南调试任何错误。
从 6.9 及更早版本升级
IDE 集成的变化
IDEA模型的变化
和getGeneratedSourceDirectories()
方法getGeneratedTestDirectories()
已从IdeaContentRoot
接口中删除。客户端应将这些调用替换为getSourceDirectories()
and并在返回的实例上getTestDirectories()
使用该方法。isGenerated()
依赖关系锁定现在默认为每个项目一个文件
依赖项锁定文件的格式已更改,因此每个项目只有一个文件,而不是每个项目的每个配置一个文件。此更改仅影响写入锁定文件。 Gradle 仍然能够加载以旧格式保存的锁定状态。
请参阅文档以了解如何迁移到新格式。迁移可以按配置执行,不必在单个步骤中完成。当将以前的锁定文件迁移到新的文件格式时,Gradle 会自动清理它们。
Gradle 模块元数据现在默认可重现
buildId
默认情况下不会填充该字段,以确保在没有更改构建输入时生成的元数据文件保持不变。如果用户愿意,仍然可以选择将此唯一标识符作为生成的元数据的一部分,请参阅文档。
便捷jcenter()
方法现已弃用
JFrog于 2021 年 2 月宣布停止使用 JCenter 存储库。许多 Gradle 构建都依赖于 JCenter 来实现项目依赖。
没有新的软件包或版本发布到 JCenter,但 JFrog 表示他们将让 JCenter 无限期地以只读状态运行。我们建议您考虑使用 mavenCentral()
,google()
或私有maven
存储库。
jcenter()
Gradle 在用作存储库时会发出弃用警告,并且计划在 Gradle 8.0 中删除此方法。
潜在的重大变化
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.4.31。
-
Groovy 已更新至Groovy 3.0.7。
Groovy 和 Groovy DSL 的更改
由于 Groovy 的下一个主要版本的更新,您在升级到 Gradle 7.0 时可能会遇到小问题。
新版本的 Groovy 有一个更严格的解析器,无法编译以前的 Groovy 版本中可能已接受的代码。如果遇到语法错误,请检查Groovy 问题跟踪器和Groovy 3 发布亮点。
一些非常具体的回归已经在 Groovy 的下一个小版本中得到修复。
Groovy 模块化
Gradle 不再嵌入groovy-all
将所有 Groovy 模块捆绑到单个 jar 中的副本 - 只有最重要的模块分布在 Gradle 发行版中。
依赖localGroovy()
项将包括以下 Groovy 模块:
-
groovy
-
groovy-ant
-
groovy-astbuilder
-
groovy-console
-
groovy-datetime
-
groovy-dateutil
-
groovy-groovydoc
-
groovy-json
-
groovy-nio
-
groovy-sql
-
groovy-templates
-
groovy-test
-
groovy-xml
但不包括以下 Groovy 模块:
-
groovy-cli-picocli
-
groovy-docgenerator
-
groovy-groovysh
-
groovy-jmx
-
groovy-jsr223
-
groovy-macro
-
groovy-servlet
-
groovy-swing
-
groovy-test-junit5
-
groovy-testng
您可以像任何其他外部依赖项一样将这些依赖项拉入您的构建中。
使用 Groovy 3 构建 Gradle 插件
gradleApi()
现在,使用 Gradle 7.0 构建的插件在使用或 时,其类路径中将包含 Groovy 3 localGroovy()
。
如果您使用Spock来测试插件,则需要使用 Spock 2.x。 Spock 1.x 和 Groovy 3 没有兼容版本。 |
dependencies {
// Ensure you use the Groovy 3.x variant
testImplementation('org.spockframework:spock-core:2.0-groovy-3.0') {
exclude group: 'org.codehaus.groovy'
}
}
// Spock 2 is based on JUnit Platform which needs to be enabled explicitly.
tasks.withType(Test).configureEach {
useJUnitPlatform()
}
表现
根据子项目和 Groovy DSL 构建脚本的数量,首次编译构建脚本或对构建脚本的类路径进行更改时,您可能会注意到性能下降。这是由于 Groovy 3 解析器的性能较慢,但 Groovy 团队已经意识到这个问题并试图缓解回归问题。
一般来说,我们也在研究如何提高 Groovy DSL 和 Kotlin DSL 的构建脚本编译性能。
遇到“在 DefaultDependencyHandler 上找不到参数 Y 的方法 X”
虽然以下错误最初看起来像是编译错误,但实际上是由于特定的“配置”已被删除。更多详细信息请参阅拆卸compile
和runtime
配置。
Could not find method testCompile() for arguments [DefaultExternalModuleDependency{group='org.junit', name='junit-bom', version='5.7.0', configuration='default'}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
更新默认工具集成版本
-
PMD 已更新至PMD 6.31.0。
-
Groovy 和 GroovyDoc 已更新至Groovy 3.0.7。
删除compile
和runtime
配置
自诞生以来,Gradle 提供了compile
和runtime
配置来声明依赖项。然而,这些不支持细粒度的依赖关系范围。因此,Gradle 3.4 中引入了更好的替代品:
-
配置
implementation
应用于声明依赖项,这些依赖项是库的实现细节:它们在编译期间对库的使用者不可见。 -
该
api
配置仅在应用java-library
插件时可用,应用于声明依赖项,这些依赖项是库 API 的一部分,需要在编译时向使用者公开。
在 Gradle 7 中,compile
和runtime
配置都被删除。因此,您必须迁移到上面的implementation
配置api
。如果您仍在使用java
Java 库的插件,则需要java-library
改为应用该插件。
删除的配置 | 新配置 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
您可以通过阅读Java 库插件文档找到有关新配置的优点以及使用哪一种配置来代替的更多详细compile
信息。runtime
使用 Groovy DSL 时,在处理删除的配置时需要注意特定的升级问题。
如果您正在创建扩展已删除配置之一的自定义配置,Gradle 可能会默默地创建不存在的配置。
这看起来像:
configurations {
// This silently creates a configuration called "runtime"
myConf extendsFrom runtime
}
您的自定义配置的依赖项解析结果可能与 Gradle 6.x 或之前的版本不同。您可能会注意到缺少依赖项或工件。
临时项目文件的位置ProjectBuilder
该ProjectBuilder
API 用于检查单元测试中的 Gradle 构建。该API用于在系统临时目录下创建临时项目文件,如java.io.tmpdir
.
API 现在会在Test
任务的临时目录下创建临时项目文件。该路径通常位于项目构建目录下。当测试需要特定文件路径时,这可能会导致测试失败。
如果测试使用ProjectBuilder.withProjectDir(…)
,则不受影响。
TestKit 测试的临时文件的位置
使用TestKit API的测试用于在系统临时目录下创建临时文件,如java.io.tmpdir
.这些文件用于存储 Gradle 发行版或另一个仅供测试的 Gradle 用户主页的副本。
TestKit 测试现在将在Test
任务的临时目录下创建临时文件。该路径通常位于项目构建目录下。当测试需要特定文件路径时,这可能会导致测试失败。
如果测试使用GradleRunner.withTestKitDir(…)
,则不受影响。
在 Windows 上使用 TestKit 监视文件系统
Windows 上的文件系统监视实现向根项目目录添加了锁,以便监视更改。当您在使用 TestKit 运行构建后尝试删除根项目目录时,这可能会导致错误。例如,使用 TestKit 与 JUnit@TempDir
扩展或TemporaryFolder
规则一起进行的测试可能会遇到此问题。为了避免这些文件锁出现问题,TestKit
请禁用文件系统监视在 Windows 上通过GradleRunner
.如果您想覆盖默认行为,可以通过传递--watch-fs
到 来启用文件系统监视GradleRunner.withArguments()
。
删除uploadArchives
任务
该uploadArchives
任务与遗留的 Ivy 或 Maven 发布机制结合使用。它已在 Gradle 7 中删除。您应该迁移到maven-publish
或ivy-publish
插件。
请参阅Maven Publish 插件的文档以在 Maven 存储库上发布。请参阅Ivy Publish 插件的文档以在 Ivy 存储库上进行发布。
依赖版本排序的变化
在依赖版本排序的上下文中,-SNAPSHOT
版本现在被认为是在最终版本之前但在任何-RC
版本之后。还考虑了更多特殊版本后缀。对于众所周知的版本后缀,这使得 Gradle 算法更接近 Maven 算法。
查看Gradle 适用的所有规则的文档。
删除 Play 框架插件
已弃用的 Play 插件已被删除。可以从插件门户获取外部替代品Play Framework 插件。
删除已弃用的 JVM 插件
这些未维护的替代 JVM 插件已被删除:
java-lang
, scala-lang
, junit-test-suite
, jvm-component
, jvm-resources
。
删除实验性 JavaScript 插件
以下用于实验性 JavaScript 集成的插件现已从发行版中删除:
coffeescript-base
, envjs
, javascript-base
, jshint
, rhino
。
如果您使用这些插件(尽管它们是实验性的),您可以在插件门户中找到合适的替代品。
配置ivy存储库的布局
采用配置块的方法已被删除,并被patternLayoutlayout
取代。
现在,在没有设置文件的情况下执行 Gradle 构建会出现错误
settings.gradle(.kts)
Gradle 构建由当前目录或父目录中的文件定义。如果没有设置文件,Gradle 构建是未定义的,并且 Gradle 在尝试执行任务时会产生错误。
要修复此错误,请为构建创建一个settings.gradle(.kts)
文件。
例外情况是通过init
任务调用 Gradle 或使用诊断命令行标志,例如--version
.
现在在项目评估后调用 Project.afterEvaluate() 会出现错误
Gradle 6.x 会警告用户有关错误行为,并忽略这种情况下的目标操作。从7.0开始,同样的情况会产生错误。插件和构建脚本应调整为afterEvaluate
仅在配置时调用。如果您遇到这样的构建失败并且相关afterEvaluate
语句已在构建源中声明,那么您只需将其删除即可。如果afterEvaluate
在插件中声明,则将问题报告给插件维护者。
现在,在值最终确定后修改文件集合会出现错误
在计算出的存储值之后调用任何变元方法(即clear()
、add()
、remove()
等)ConfigurableFileCollection
都会引发异常。用户和插件作者应该调整他们的代码,以便ConfigurableFileCollection
在读取值之前在配置时间内发生所有配置。
go除ProjectLayout#configurableFiles
请改用ObjectFactory#fileCollection()
。
go除BasePluginConvention.libsDir
和BasePluginConvention.distsDir
请改用libsDirectory
和distsDirectory
属性。
go除UnableToDeleteFileException
现有用法应替换为RuntimeException
.
Checkstyle 和 PMD 插件中删除的属性
-
getter
configDir
和 setter 已从 Checkstle 任务和扩展中删除。而是使用该configDirectory
属性。 -
getter
rulePriority
和 setter 已从 Pmd 任务和扩展中删除。而是使用该rulesMinimumPriority
属性。
删除插件baseName
中的属性distribution
和getBaseName()
方法setBaseName()
已从类中删除Distribution
。客户应将用途替换为distributionBaseName
属性。
使用AbstractTask
AbstractTask
使用类型或类型扩展注册任务AbstractTask
在 Gradle 6.5 中已被弃用,现在在 Gradle 7.0 中是一个错误。您可以使用DefaultTask代替。
go除BuildListener.buildStarted(Gradle)
BuildListener.buildStarted(Gradle)
在 Gradle 6.0 中已弃用,现已在 Gradle 7.0 中删除。请改用BuildListener.beforeSettings(Settings)。
删除未使用的StartParameter
API
自 Gradle 5.0 起,以下 API 不再可通过命令行选项使用,现已删除
:StartParameter.useEmptySettings()
、StartParameter.isUseEmptySettings()
和。StartParameter.setSearchUpwards(boolean)
StartParameter.isSearchUpwards()
删除在“主”目录中搜索设置文件
Gradle 不再支持在master
同级目录中指定的目录中发现设置文件。如果您的构建仍然使用此已弃用的功能,请考虑重构构建以使根目录与项目层次结构的物理根匹配。您可以在用户手册中找到有关如何构建 Gradle 构建或构建组合的master
更多信息。或者,您仍然可以通过仅使用
任务的完全限定路径从目录调用构建来运行这样的构建中的任务。
go除ValidateTaskProperties
该ValidateTaskProperties
任务已被删除并由ValidatePlugins任务取代。
go除ImmutableFileCollection
该ImmutableFileCollection
类型已被删除。请改用工厂方法。可以通过Project.layout获取项目布局的句柄。
go除ComponentSelectionReason.getDescription
该方法ComponentSelectionReason.getDescription
已被删除。它被替换为ComponentSelectionReason.getDescriptions
返回一个 列表ComponentSelectionDescriptor
,每个列表都有一个getDescription
。
删除域对象集合构造函数
以下已弃用的构造函数已被删除:
-
DefaultNamedDomainObjectList(类,实例化器,命名器)
-
DefaultNamedDomainObjectSet(类,实例化器)
-
DefaultPolymorphicDomainObjectContainer(类,实例化器)
-
FactoryNamedDomainObjectContainer(类,实例化器,NamedDomainObjectFactory)
删除 DefaultVersionSelectorScheme 构造函数
这个内部 API 在Nebula 插件等插件中使用,在 Gradle 5.x 时间线中已弃用,现已删除。最新的插件版本不应再引用它。
config_loc
在插件上设置配置属性checkstyle
现在是一个错误
该checkstyle
插件现在无法执行以下配置
checkstyle {
configProperties['config_loc'] = file("path/to/checkstyle-config-dir")
}
构建应使用块声明 checkstyle 配置checkstyle
:
checkstyle {
configDirectory = file("path/to/checkstyle-config-dir")
}
在生产者完成之前查询提供者的映射值现在是一个错误
Gradle 6.x 警告用户错误行为,然后返回可能不正确的提供程序值。从 7.0 开始,相同的情况将产生错误。任务完成后,应调整插件和构建脚本以查询提供程序的映射值,例如任务输出属性。
任务验证问题现在是错误
Gradle 6.0 开始警告有关任务定义的问题(例如错误定义的输入或输出)。对于 Gradle 7.0,这些警告现在是错误,并且会使构建失败。
当与本地项目存在严格版本冲突时行为发生变化
以前的 Gradle 版本在特定配置中的冲突解决方面存在不一致的行为: - 您的项目声明了对已发布模块的严格依赖(例如,com.mycompany:some-module:1.2!!
,其中1.2!!
是严格依赖于 1.2 的简写符号) - 您的构建实际上com.mycompany:some-module
更高版本提供
以前的 Gradle 版本会成功,尽管有严格的限制,但仍会选择项目依赖项。从 Gradle 7 开始,这将触发依赖解析失败。
请参阅此问题了解更多背景信息。
弃用
任务之间缺少依赖关系
不推荐使用在某个位置产生输出的任务和通过将其引用为输入来消耗该位置的另一个任务,而无需依赖于生产者任务的消费者任务。解决此问题的方法是添加从消费者到生产者的依赖关系。
重复策略
现在,当复制操作(或任何使用 的操作org.gradle.api.file.CopySpec
)遇到重复条目并且未设置重复策略时,Gradle 7 会失败。请查看CopySpec 文档了解详细信息。
从 6.8 及更早版本升级
没有从 6.8 到 6.9 的升级说明,因为 6.9 仅包含错误修复。
从 6.7 及更早版本升级
潜在的重大变化
工具链 API 现在标记为 @NonNull
支持 Java 工具链功能的 APIorg.gradle.jvm.toolchain
现在标记为@NonNull
。
这可能会影响 Kotlin 使用者,因为 API 的返回类型不再可为空。
更新默认工具集成版本
-
JaCoCo 已更新至0.8.6。
-
Checkstyle 已更新至Checkstyle 8.37。
-
CodeNarc 已更新至CodeNarc 2.0.0。
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.4.20。请注意,Gradle 脚本仍然使用 Kotlin 1.3 语言。
-
Apache Ant 已更新至 1.10.9 以修复CVE-2020-11979
导入 Eclipse 的项目现在包括自定义源集类路径
以前,Eclipse 导入的项目仅包含主源集和测试源集的依赖项。自定义源集的编译和运行时类路径被忽略。
从 Gradle 6.8 开始,导入到 Eclipse 中的项目包括构建定义的每个源集的编译和运行时类路径。
SourceTask 对空目录不再敏感
以前,在最新检查和为 中声明的源构建缓存键计算期间将考虑空目录SourceTask
。这意味着包含空目录的源树和不包含空目录的其他相同源树将被视为不同的源,即使任务会产生相同的输出。在 Gradle 6.8 中,SourceTask
现在在执行最新检查和构建缓存键计算期间忽略空目录。在绝大多数情况下,这是所需的行为,但当SourceTask
源中存在空目录时,任务可能会扩展,但也会产生不同的输出。对于需要关注的任务,您可以公开一个不带@IgnoreEmptyDirectories
注释的单独属性,以捕获这些更改:
@InputFiles
@SkipWhenEmpty
@PathSensitive(PathSensitivity.ABSOLUTE)
public FileTree getSourcesWithEmptyDirectories() {
return super.getSource()
}
出版物的变更
现在,发布依赖于强制平台的组件会触发验证错误,从而防止意外发布错误的元数据:强制平台用例应仅限于应用程序,而不是可以从其他库或应用程序使用的内容。
如果出于某种原因,您仍然希望发布依赖于强制平台的组件,您可以按照文档禁用验证。
在执行阶段更改默认排除
为了方便起见,Gradle 的文件树应用了一些默认的排除模式 — 事实上与 Ant 的默认值相同。请参阅用户手册了解更多信息。有时,Ant 的默认排除被证明是有问题的,例如当您想要将 包含.gitignore
在存档文件中时。
在执行阶段更改 Gradle 的默认排除可能会导致最新检查的正确性问题。因此,您只能在设置脚本中更改 Gradle 的默认排除项,请参阅用户手册以获取示例。
弃用
从包含的构建中引用任务
不推荐直接引用 中包含的构建中的任务mustRunAfter
,shouldRunAfter
并且finalizedBy
任务方法已被弃用。任务排序使用mustRunAfter
和 以及shouldRunAfter
由 指定的终结器finalizedBy
应该用于构建内的任务排序。如果您碰巧使用上述方法定义了交叉构建任务顺序,请考虑重组此类构建并将它们相互解耦。
在“master”目录中搜索设置文件
master
当您的构建依赖于在同级目录中指定的目录中查找设置文件时,Gradle 将发出弃用警告。
如果您的构建使用此功能,请考虑重构构建以使根目录与项目层次结构的物理根匹配。
master
或者,您仍然可以通过仅使用
任务的完全限定路径从目录调用构建来运行这样的构建中的任务。
使用方法NamedDomainObjectContainer<T>.invoke(kotlin.Function1)
Gradle Kotlin DSL 扩展已更改为更倾向于 GradleAction<T>
类型而不是 Kotlin 函数类型。
虽然更改对于 Kotlin 客户端来说应该是透明的,但调用 Kotlin DSL 扩展的 Java 客户端需要更新才能使用 API Action<T>
。
从 6.6 及更早版本升级
潜在的重大变化
buildSrc 现在可以从根查看包含的构建
以前,buildSrc
构建方式是从根构建中忽略包含的构建。
从 Gradle 6.7 开始,buildSrc
可以从根构建中查看任何包含的构建。这可能会导致依赖项被包含的构建替换buildSrc
。如果buildSrc
.
更新默认工具集成版本
-
PMD 已更新至PMD 6.26.0。
-
Checkstyle 已更新至Checkstyle 8.35。
-
CodeNarc 已更新至CodeNarc 1.6.1。
弃用
在执行阶段更改默认排除
为了方便起见,Gradle 的文件树应用了一些默认的排除模式 — 事实上与 Ant 的默认值相同。请参阅用户手册了解更多信息。有时,Ant 的默认排除被证明是有问题的,例如当您想要将 包含.gitignore
在存档文件中时。
在执行阶段更改 Gradle 的默认排除可能会导致最新检查的正确性问题,因此已被弃用。您只能在设置脚本中更改 Gradle 的默认排除,有关示例,请参阅用户手册。
直接使用配置作为依赖项
Configuration
Gradle 允许直接使用的实例作为依赖项:
dependencies {
implementation(configurations.myConfiguration)
}
这种行为现在已被弃用,因为它令人困惑:人们可能期望首先解析“依赖配置”,并将解析结果作为依赖项添加到包含配置中,但事实并非如此。已弃用的版本可以替换为实际行为,即配置继承:
configurations.implementation.extendsFrom(configurations.myConfiguration)
从 6.5 及更早版本升级
潜在的重大变化
更新捆绑的 Gradle 依赖项
-
Ant 已更新至1.10.8。
-
Groovy 已更新至Groovy 2.5.12。
依赖替换和变体感知依赖解析
随着这一变化,现有的依赖项与更丰富的选择器的替代(例如平台依赖项)将不再像以前那样工作。必须在目标选择器中定义变体感知部分。
如果您符合以下条件,您可能会受到此更改的影响:
-
对平台有依赖性,例如
implementation platform("org:platform:1.0")
-
或者如果您指定依赖项的属性,
-
并且您对这些依赖项使用解析规则。
如果您受到影响,请参阅文档以解决问题。
弃用
Gradle 6.6 中没有弃用。
从 6.4 及更早版本升级
潜在的重大变化
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.3.72。
-
Groovy 已更新至Groovy 2.5.11。
更新默认工具集成版本
-
PMD 已更新至PMD 6.23.0。
弃用
内部类 AbstractTask 已弃用
AbstractTask
是一个内部类,在公共 API 上可见,作为公共类型的超类DefaultTask
。
AbstractTask
将在 Gradle 7.0 中删除,并且以下内容在 Gradle 6.5 中已弃用:
-
注册一个类型为
AbstractTask
或 的任务TaskInternal
。您可以从任务注册中删除任务类型,Gradle 将DefaultTask
改为使用。 -
AbstractTask
注册一个类型是 的子类但不是 的子类的任务DefaultTask
。您可以将任务类型更改为扩展DefaultTask
。 -
AbstractTask
使用插件代码或构建脚本中的类。您可以更改要使用的代码DefaultTask
。
从 6.3 及更早版本升级
潜在的重大变化
PMD 插件默认需要 PMD 6.0.0 或更高版本
Gradle 6.4 默认启用增量分析。增量分析仅在 PMD 6.0.0 或更高版本中可用。如果你想使用旧的PMD版本,你需要禁用增量分析:
pmd {
incrementalAnalysis = false
}
依赖锁定的变化
在 Gradle 6.4 中,依赖锁定LockMode
的孵化 API发生了变化。该值现在通过 aProperty<LockMode>
而不是直接设置器设置。这意味着必须为 Kotlin DSL 更新设置值的表示法:
dependencyLocking {
lockMode.set(LockMode.STRICT)
}
Groovy DSL 的用户不应受到影响,因为该符号lockMode = LockMode.STRICT
仍然有效。
已发布元数据中的 Java 版本
如果 Java 库是使用 Gradle 模块元数据发布的,则其支持的 Java 版本信息将编码在org.gradle.jvm.version
属性中。默认情况下,此属性设置为您在 中配置的内容java.targetCompatibility
。如果未配置,则将其设置为运行 Gradle 的当前 Java 版本。例如,更改特定编译任务的版本javaCompile.targetCompatibility
对该属性没有影响,如果未手动调整该属性,则会导致错误信息。现在此问题已修复,并且该属性默认为与构建已发布 jar 的源关联的编译任务的设置。
具有自定义布局的 Ivy 存储库
在具有自定义存储库布局的 Ivy 存储库上发布时,包含的 Gradle 版本从 6.0 到 6.3.x 可能会生成错误的 Gradle 模块元数据。从 6.4 开始,如果 Gradle 检测到您正在使用自定义存储库布局,它将不再发布 Gradle 模块元数据。
新属性可能会隐藏构建脚本中的变量
此版本 在不同的地方引入了一些新属性 - mainClass
、mainModule
、 -。modularity
由于这些是非常通用的名称,因此您有可能在构建脚本中使用其中之一作为变量名称。然后,新属性可能会以不期望的方式隐藏变量之一,从而导致构建失败,即访问该属性而不是同名的局部变量。您可以通过重命名构建脚本中相应的变量来修复它。
受影响的是application {}
和java {}
配置块内的配置代码、使用 和 进行设置的 java 执行设置project.javaexec {}
以及各种任务配置(JavaExec
、CreateStartScripts
、JavaCompile
、Test
、Javadoc
)内的配置代码。
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.3.71。
弃用
Gradle 6.3 和 6.4 之间没有弃用。
从 6.2 及更早版本升级
潜在的重大变化
IDEA 中可用的依赖项较少
Gradle 不再包含注释处理器类路径作为 IDEA 中提供的依赖项。 IDEA 在编译时看到的依赖项与解析编译类路径(名为 的配置)后 Gradle 看到的依赖项相同compileClasspath
。这可以防止注释处理器依赖项泄漏到项目代码中。
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.3.70。
-
Groovy 已更新至Groovy 2.5.10。
更新默认工具集成版本
-
PMD 已更新至PMD 6.21.0。
-
CodeNarc 已更新至CodeNarc 1.5。
删除了某些 32 位操作系统的丰富控制台支持
Gradle 6.3 不支持32 位 Unix 系统和旧 FreeBSD 版本(早于 FreeBSD 10)的丰富控制台。 Microsoft Windows 32 位不受影响。
Gradle 将继续在 32 位系统上构建项目,但将不再显示丰富的控制台。
从 6.1 及更早版本升级
潜在的重大变化
编译和运行时类路径现在默认请求库变体
JVM 项目中的类路径现在显式请求该org.gradle.category=library
属性。如果无法使用某个库,这会导致更清晰的错误消息。例如,当库不支持所需的 Java 版本时。实际效果是,现在所有平台依赖项都必须如此声明。之前,当platform()
本地平台或使用 Gradle 模块元数据发布的平台省略关键字时,平台依赖项也会意外地发挥作用。
项目根目录中的属性gradle.properties
泄漏到buildSrc
并包含在构建中
Gradle 6.2 和 Gradle 6.2.1 中存在回归,导致项目根gradle.properties
文件中设置的 Gradle 属性泄漏到buildSrc
构建以及根包含的任何构建中。
buildSrc
如果构建或包含的构建突然发现来自项目根gradle.properties
文件的属性存在意外或不兼容的值,这可能会导致您的构建开始失败。
该回归已在 Gradle 6.2.2 中修复。
弃用
Gradle 6.1 和 6.2 之间没有弃用。
从 6.0 及更早版本升级
弃用
在任务完成之前查询任务的映射输出属性
在任务完成之前查询映射输出属性的值可能会导致奇怪的构建失败,因为这表明可能会错误地使用过时或不存在的输出。此行为已被弃用,并将发出弃用警告。这将成为 Gradle 7.0 中的错误。
下面的示例演示了在 Producer 执行之前解析 Producer 的输出文件的这个问题:
class Consumer extends DefaultTask {
@Input
final Property<Integer> threadPoolSize = ...
}
class Producer extends DefaultTask {
@OutputFile
final RegularFileProperty outputFile = ...
}
// threadPoolSize is read from the producer's outputFile
consumer.threadPoolSize = producer.outputFile.map { it.text.toInteger() }
// Emits deprecation warning
println("thread pool size = " + consumer.threadPoolSize.get())
如果在完成之前查询 的值,consumer.threadPoolSize
将产生弃用警告producer
,因为尚未生成输出文件。
已停止使用的方法
以下方法已停止使用,不应再使用。它们将在 Gradle 7.0 中被删除。
-
BasePluginConvention.setProject(ProjectInternal)
-
BasePluginConvention.getProject()
-
StartParameter.useEmptySettings()
-
StartParameter.isUseEmptySettings()
替代 JVM 插件(又名“软件模型”)
Gradle 2.x 中引入了一组用于 Java 和 Scala 开发的替代插件,作为基于“软件模型”的实验。这些插件现已弃用,最终将被删除。如果您仍在使用这些旧插件( java-lang
、scala-lang
、jvm-component
、jvm-resources
、 )之一,请查阅有关构建 Java 和 JVM 项目junit-test-suite
的文档,以确定哪些稳定的 JVM 插件适合您的项目。
潜在的重大变化
ProjectLayout
工作人员操作不再可作为服务使用
在 Gradle 6.0 中,该ProjectLayout
服务通过服务注入可供工作人员操作使用。该服务允许可变状态泄漏到辅助操作中,并引入了一种在辅助操作中未声明依赖项的方法。
ProjectLayout
已从可用服务中删除。正在使用的工作操作ProjectLayout
应切换为注入projectDirectory
或buildDirectory
作为参数。
更新捆绑的 Gradle 依赖项
-
Kotlin 已更新至Kotlin 1.3.61。
更新默认工具集成版本
-
Checkstyle 已更新至Checkstyle 8.27。
-
PMD 已更新至PMD 6.20.0。
发布 Spring Boot 应用程序
从 Gradle 6.2 开始,Gradle 在上传之前执行健全性检查,以确保您不会上传过时的文件(由另一个构建生成的文件)。这给使用该组件上传的 Spring Boot 应用程序带来了一个问题components.java
:
Artifact my-application-0.0.1-SNAPSHOT.jar wasn't produced by this build.
这是由于jar
Spring Boot 应用程序禁用了主任务,而组件希望它存在。由于该bootJar
任务默认使用与主任务相同的文件,因此以前版本的 Gradle 会:jar
-
发布过时的
bootJar
工件 -
或者如果
bootJar
之前没有调用该任务则失败
解决方法是告诉 Gradle 要上传什么。如果您想上传bootJar
,那么您需要配置传出配置来执行此操作:
configurations {
[apiElements, runtimeElements].each {
it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
it.outgoing.artifact(bootJar)
}
}
或者,您可能想要重新启用该jar
任务,并添加bootJar
不同的分类器。
jar {
enabled = true
}
bootJar {
classifier = 'application'
}