将构建从 Gradle 4.x 升级到 5.0
本章提供将旧版 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 或更高版本。 |
对于所有用户
-
如果您尚未使用最新的 4.10.x 版本,请阅读以下部分以获取将项目升级到最新的 4.10.x 版本的帮助。我们建议升级到最新的 4.10.x 版本,以便在升级到 5.0 之前获取最有用的警告和弃用信息。避免同时升级 Gradle 和迁移到 Kotlin DSL,以便在出现潜在问题时轻松进行故障排除。
-
尝试运行
gradle help --scan
并查看生成的构建扫描的弃用视图。如果没有警告,则不会出现“弃用”选项卡。这样您就可以看到适用于您的构建的任何弃用警告。如果您尝试直接升级到 Gradle 5.x,它将生成(可能不太明显)错误。
或者,您可以运行
gradle help --warning-mode=all
以在控制台中查看弃用信息,尽管它可能不会报告那么多详细信息。 -
更新您的插件。
一些插件将与这个新版本的 Gradle 兼容,例如因为它们使用已删除或更改的内部 API。当插件尝试使用 API 的已弃用部分时,上一步将通过发出弃用警告来帮助您识别潜在问题。
特别是,您需要至少使用 2.x 版本的Shadow Plugin。
-
运行
gradle wrapper --gradle-version 5.0
将项目更新到5.0 -
如果您还没有迁移到 Java 8 或更高版本,请迁移到该版本。 Gradle 4.x 需要 Java 7 才能运行,而 Gradle 5 则需要 Java 8 才能运行。
-
阅读从 4.10 升级部分并进行任何必要的更改。
-
尝试运行该项目并使用故障排除指南调试任何错误。
此外,Gradle 添加了几个重要的新功能和改进功能,您应该考虑在构建中使用这些功能:
-
在您的构建中使用本机BOM 导入。
-
Worker API,用于支持工作单元并行运行。
-
用于延迟创建和配置任务的新 API ,可以显着缩短构建的配置时间。
其他需要注意的可能会破坏您的构建的显着变化包括:
-
这一更改意味着您应该配置现有
wrapper
任务init
,而不是定义自己的任务。 -
在 Maven POM 排除中遵守隐式通配符,这可能会导致以前没有的依赖项被排除。
-
命令行客户端、Gradle 守护程序以及所有工作人员(包括编译器和测试执行器)的默认内存设置已大大减少。
-
多个代码质量插件的默认版本已更新。
-
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,以获得有关哪些弃用影响您的构建的报告。
以下重大更改并非来自弃用,而是行为更改的结果:
-
该块的评估
publishing {}
不再推迟到需要时,但其行为与任何其他块一样。afterEvaluate {}
如果您需要推迟评估,请使用。 -
Javadoc
和任务Groovydoc
现在在执行之前删除文档的目标目录。添加此功能是为了从上次任务执行中删除陈旧的输出文件。 -
Java Library Distribution Plugin现在基于Java Library Plugin而不是Java Plugin。
虽然它应用了 Java 插件,但它的行为略有不同(例如,它添加了配置
api
)。因此,请务必检查您的构建在升级后是否按预期运行。 -
html
on 属性现在CheckstyleReport
返回FindBugsReport
一个CustomizableHtmlReport
更容易从 Java 和 Kotlin 等静态类型语言配置的实例。 -
配置避免 API已更新,以防止创建和配置从未使用过的任务。
-
命令行客户端、Gradle 守护程序以及所有工作人员(包括编译器和测试执行器)的默认内存设置已大大减少。
-
多个代码质量插件的默认版本已更新。
-
Gradle 使用的多个库版本已升级。
以下重大更改将在 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
设置。
-
- 处理文件
-
-
您不能再使用关键字或方法将
FileCollection
对象转换为其他类型。as
asType()
-
您不能再作为CopySpec.from(Object, Action)
null
的配置操作传递。 -
为了更好地与 Kotlin DSL 兼容,CopySpec.duplicatesStrategy不再可为空。属性设置器不再接受
null
将属性重置回默认值的方法。代替使用DuplicatesStrategy.INHERIT
。 -
该
FileCollection.stopExecutionIfEmpty()
方法已被删除 - 请使用任务属性上的@SkipWhenEmpty注释。FileCollection
-
该
FileCollection.add()
方法已被删除 - 使用Project.files()和Project.fileTree()创建可配置文件集合/文件树并通过ConfigurableFileCollection.from()添加到它们。 -
SimpleFileCollection
已被删除 - 请使用Project.files(Object...)代替。 -
不要扩展自己的类
AbstractFileCollection
- 请改用Project.files()方法。此问题可能表现为缺少getBuildDependencies()
方法。
-
- Java 构建
-
-
该
CompileOptions.bootClasspath
属性已被删除 - 请改用CompileOptions.bootstrapClasspath。 -
您不能再用作
-source-path
通用编译器参数 - 请改用CompileOptions.sourcepath。 -
您不能再用作
-processorpath
通用编译器参数 - 请改用CompileOptions.annotationProcessorPath。 -
Gradle 将不再自动应用编译类路径上的注释处理器 - 请改用CompileOptions.annotationProcessorPath。
-
该
testClassesDir
属性已从测试任务中删除 - 请改用testClassesDirs。 -
该属性已从JDepend任务和SourceSetOutput
classesDir
中删除。请改用JDepend.classesDirs和SourceSetOutput.classesDirs属性。 -
构造
JavaLibrary(PublishArtifact, DependencySet)
函数已被删除 - 这是由Shadow Plugin使用的,因此请确保至少升级到该插件的 2.x 版本。 -
该
JavaBasePlugin.configureForSourceSet()
方法已被删除。 -
您不能再创建自己的JavaPluginConvention、ApplicationPluginConvention、WarPluginConvention、EarPluginConvention、BasePluginConvention和ProjectReportsPluginConvention实例。
-
该
Maven
插件用于发布高度过时的 Maven 2 元数据格式。这已更改,现在将发布 Maven 3 元数据,就像Maven Publish
插件一样。随着 Maven 2 支持的删除,配置独特快照行为的方法也被删除。 Maven 3 仅支持唯一快照,因此我们决定删除它们。
-
- 任务和属性
-
-
以下与惰性属性相关的遗留类和方法已被删除 - 使用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)方法。
-
您无法再通过TaskInputs和TaskOutputs注册无效的输入和输出。
-
和
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 版本中,可以从子类访问
source
in 的字段。SourceTask
现在情况不再是这样,因为该source
字段现在被声明为private
. -
在Worker API中,无法再设置Worker的工作目录。
-
与依赖性和版本限制相关的行为变化可能会影响少数用户。
-
DefaultTask 上的属性工厂方法发生了一些更改,可能会影响自定义任务的创建。
-
从 4.9 及更早版本升级
如果您尚未使用版本 4.9,请跳到适用于您当前 Gradle 版本的部分,然后继续向上操作,直到到达此处。然后,在升级到 Gradle 4.10 时应用这些更改。
已弃用的类、方法和属性
请点击 API 链接了解如何处理这些弃用(如果此处未提供额外信息):
-
TaskContainer.add()
并且TaskContainer.addAll()
- 使用TaskContainer.create()或TaskContainer.register()代替
潜在的重大变化
-
Kotlin DSL 中存在一些潜在的重大变更 - 请参阅该项目发行说明的重大变更部分。
-
您不能再将任何Project.beforeEvaluate()或Project.afterEvaluate()方法与惰性任务配置一起使用,例如在TaskContainer.register()块内。
-
PluginUnderTestMetadata和GeneratePluginDescriptors ( Java Gradle 插件开发插件使用的类)均已更新为使用Provider API。
使用Property.set()方法修改它们的值,而不是使用标准属性分配语法,除非您在 Groovy 构建脚本中执行此操作。在这种情况下,标准属性分配仍然有效。
从 4.8 及更早版本升级
潜在的重大变化
-
您不能再将 GPath 语法与tasks.withType()一起使用。
请改用Groovy 的扩展运算符。例如,您可以替换
tasks.withType(JavaCompile).name
为tasks.withType(JavaCompile)*.name
.
从 4.7 及更早版本升级
-
配置现有
wrapper
任务init
而不是定义自己的任务 -
如果您当前正在为此使用插件或自定义解决方案,请考虑迁移到内置依赖项锁定机制
潜在的重大变化
-
如果找不到指定的初始化脚本,构建现在将失败。
-
TaskContainer.remove()
现在实际上删除了给定的任务 - 某些插件可能意外地依赖于旧的行为。 -
Kotlin DSL 现在尊重 JSR-305 包注释。
这将导致一些根据 JSR-305 注释的类型被视为可为 null,而之前它们被视为不可为 null。这可能会导致构建脚本中出现编译错误。有关详细信息,请参阅相关的 Kotlin DSL 发行说明。
-
错误消息现在将定向到标准错误而不是标准输出,除非控制台同时附加到标准输出和标准错误。这可能会影响抓取构建的普通控制台输出的工具。如果您从早期版本的 Gradle 升级,请忽略此更改。
从 4.6 及更早版本升级
潜在的重大变化
-
按照惯例,Gradle 现在将在根项目的config/checkstyle目录中查找 Checkstyle 配置文件。
子项目中的 Checkstyle 配置文件(旧的惯例位置)将被忽略,除非您通过checkstyle.configDir或checkstyle.config显式配置它们的路径。
-
Gradle 的普通控制台输出的结构已更改,这可能会破坏抓取该输出的工具。
-
许多与编译、链接和安装相关的本机任务的 API发生了突破性的变化。
-
[Kotlin DSL] 用于访问 Gradle 构建属性的委托属性(例如在gradle.properties中定义)现在必须显式键入。
-
[Kotlin DSL]
plugins {}
在嵌套作用域内声明块现在会引发异常。 -
[Kotlin DSL]
pluginManagement {}
现在只允许一个块。 -
接口提供的缓存控制 DSL
org.gradle.api.artifacts.cache.*
不再可用。 -
getEnabledDirectoryReportDestinations()
,getEnabledFileReportDestinations()
并且getEnabledReportNames()
已全部从 中删除org.gradle.api.reporting.ReportContainer
。 -
StartParameter.projectProperties和StartParameter.systemPropertiesArgs现在返回不可变映射。
从 4.5 及更早版本升级
弃用
-
您不应将注释处理器放在编译类路径上或使用
-processorpath
编译器参数声明它们。应该将它们添加到
annotationProcessor
配置中。如果您不需要任何处理,但您的编译类路径无意中包含处理器(例如作为您依赖的库的一部分),请使用-proc:none
编译器参数来忽略它。
潜在的重大变化
-
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 及更早版本升级
-
确保您有一个settings.gradle文件:它可以避免性能损失并允许您设置根项目的名称。
-
Gradle 现在忽略包含的构建(复合构建)的构建缓存配置,而是对所有构建使用根构建的配置。
潜在的重大变化
-
ValidateTaskProperties.setOutputFile()
删除了两个重载方法。当从构建脚本访问任务时,它们会被自动生成的设置器替换,但构建脚本之外的插件和其他代码不会出现这种情况。 -
Maven Publish Plugin 现在生成更完整的 maven-metadata.xml 文件,包括维护元素列表
<snapshotVersion>
。某些旧版本的 Maven 可能无法使用此元数据。 -
任务
Depend
类型已被删除。 -
Project.file(Object)不再规范不区分大小写的文件系统上文件路径的大小写。现在,在这种情况下它会忽略大小写,并且不会触及文件系统。
-
ListProperty不再扩展Property。
从 4.3 及更早版本升级
潜在的重大变化
-
AbstractTestTask现在通过非 JVM 测试任务以及Test进行了扩展。
AbstractTestTask
因此,插件应该小心配置所有类型的任务。 -
EclipseClasspath.defaultOutputDir的默认输出位置已从
$projectDir
/bin更改为$projectDir
/bin/default。 -
已弃用的内容
InstallExecutable.setDestinationDir(Provider)
已被删除 - 使用InstallExecutable.installDirectory代替。 -
已弃用的内容
InstallExecutable.setExecutable(Provider)
已被删除 - 使用InstallExecutable.executableFile代替。 -
Gradle 将不再优先选择在路径上找到的 Visual Studio 版本而不是其他位置。现在这是最后的手段。
您可以通过VisualCpp.setInstallDir(Object)指定所需 Visual Studio 版本的安装目录来绕过工具链发现。
-
pluginManagement.repositories
现在的类型为RepositoryHandler而不是PluginRepositoriesSpec
,后者已被删除。 -
依赖项解析期间的 5xx HTTP 错误现在将触发构建中的异常。
-
嵌入式Apache Ant已从1.9.6升级到1.9.9。
-
Gradle 使用的多个第三方库已升级以修复安全问题。
从 4.2 及更早版本升级
其他弃用
-
您不应再通过 Tooling API 运行早于 2.6 的 Gradle 版本。
-
您不应再通过 3.0 以上版本的 Tooling API 运行任何版本的 Gradle。
-
您不应再链接TaskInputs.property(String,Object)和TaskInputs.properties(Map)方法。
潜在的重大变化
-
DefaultTask.newOutputDirectory()现在返回 a
DirectoryProperty
而不是 aDirectoryVar
。 -
DefaultTask.newOutputFile()现在返回 a
RegularFileProperty
而不是 aRegularFileVar
。 -
DefaultTask.newInputFile()现在返回 a
RegularFileProperty
而不是 aRegularFileVar
。 -
ProjectLayout.buildDirectory现在返回 a
DirectoryProperty
而不是DirectoryVar
。 -
AbstractNativeCompileTask.compilerArgs现在是类型
ListProperty<String>
而不是List<String>
。 -
AbstractNativeCompileTask.objectFileDir现在是 type
DirectoryProperty
而不是File
。 -
AbstractLinkTask.linkerArgs现在是类型
ListProperty<String>
而不是List<String>
。 -
TaskDestroyables.getFiles()
不再是公共 API 的一部分。 -
现在,依赖项的版本范围重叠会导致 Gradle 选择满足所有声明范围的版本。
例如,如果
some-module
发现对版本范围为 的依赖项[3,6]
以及传递范围为 的依赖项[4,8]
,则 Gradle 现在会选择版本 6 而不是 8。之前的行为是选择 8。 -
用 或者或now
Iterable
标记的属性中元素的顺序很重要。如果顺序发生变化,该属性将不再被视为是最新的。@OutputFiles
@OutputDirectories
@OutputFile
更喜欢使用带有/@OutputDirectory
注释的单独属性,或者使用带有/ 的Map
属性。@OutputFiles
@OutputDirectories
-
当有另一个存储库可以检查时,Gradle 将不再忽略存储库中的依赖项解析错误。相反,依赖关系解析将会失败。这会导致解析结果更具确定性。
从 4.1 及更早版本升级
潜在的重大变化
-
TaskFilePropertyBuilder和TaskOutputFilePropertyBuilder
withPathSensitivity()
上的方法已被删除。 -
捆绑包
bndlib
已从 3.2.0 升级到 3.4.0。 -
FindBugs 插件不再从其分析中呈现进度信息。如果您以任何方式依赖该输出,则可以使用FindBugs.showProgress启用它。
从4.0升级
-
考虑使用新的Worker API来使构建中的工作单元能够并行运行。
潜在的重大变化
-
与 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
.
细节变化
[5.0] 默认内存设置已更改
命令行客户端现在以 64MB 堆启动,而不是 1GB。这可能会影响使用模式直接在客户端 VM 内运行的构建--no-daemon
。我们不鼓励使用--no-daemon
,但如果必须使用它,可以使用GRADLE_OPTS
环境变量增加可用内存。
Gradle 守护进程现在以 512MB 堆启动,而不是 1GB。大型项目可能必须使用该org.gradle.jvmargs
属性来增加此设置。
所有工作线程(包括编译器和测试执行器)现在都以 512MB 堆开始。以前的默认值是物理内存的 1/4。大型项目可能必须在相关任务上增加此设置,例如JavaCompile
或Test
。
[5.0] 代码质量插件的新默认版本
以下代码质量插件的默认工具版本已更新:
-
Checkstyle插件现在默认使用8.12而不是 6.19。
-
CodeNarc插件现在默认使用1.2.1而不是 1.1。
-
此外,默认规则集已从现已弃用的更改
java-basic
为category/java/errorprone.xml
.不过,我们建议显式配置规则集。
[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
依赖解析引擎中添加了新功能。其中包括复杂的版本约束 ( prefer
、strictly
、reject
)、依赖性约束和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 实例注册为声明的输出:
class MyTask extends DefaultTask {
// note: no annotation here
final RegularFileProperty outputFile = newOutputFile()
}
task myOtherTask {
def outputFile = newOutputFile()
doLast { ... }
}
open class MyTask : DefaultTask() {
// note: no annotation here
val outputFile: RegularFileProperty = newOutputFile()
}
task("myOtherTask") {
val outputFile = newOutputFile()
doLast { ... }
}
现在你必须显式注册outputFile
,如下所示:
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 { ... }
}
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()
存储库的元数据源来解决:
pluginManagement {
repositories {
gradlePluginPortal().tap {
metadataSources {
mavenPom()
artifact()
}
}
}
}
pluginManagement {
repositories {
gradlePluginPortal().apply {
(this as MavenArtifactRepository).metadataSources {
mavenPom()
artifact()
}
}
}
}
Java 库分发插件利用 Java 库插件
此外,插件创建的默认发行版将包含runtimeClasspath
配置的所有工件,而不是已弃用的runtime
配置。
配置避免 API 不允许常见配置错误
Gradle 4.9 中引入的配置避免 API允许您避免创建和配置从未使用过的任务。
使用现有 API,此示例添加了两个任务 (foo
和bar
):
tasks.create("foo") {
tasks.create("bar")
}
tasks.create("foo") {
tasks.create("bar")
}
当将其转换为使用新 API 时,会发生一些令人惊讶的事情:bar
不存在。新的 API 仅在必要时执行配置操作,因此register()
for 任务仅在配置bar
时执行。foo
tasks.register("foo") {
tasks.register("bar") // WRONG
}
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:PutObjectAcl
和s3: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 Plugin、Application Plugin或War Plugin。
要使用新方法,只需upload<Conf>
用块替换任何配置即可publishing {}
。有关详细信息,请参阅发布概述一章。
[4.8] 使用延迟配置来发布插件
在 Gradle 4.8 之前,该publishing {}
块被隐式地视为内部的所有逻辑都是在项目评估后执行的。这很令人困惑,因为它是唯一表现出这种行为的块。作为 Gradle 4.8 稳定性工作的一部分,我们反对这种行为并要求所有用户迁移他们的构建。
可以通过将以下内容添加到设置文件来开启新的稳定行为:
enableFeaturePreview('STABLE_PUBLISHING')
enableFeaturePreview("STABLE_PUBLISHING")
我们建议使用本地存储库进行测试运行,以查看所有工件是否仍然具有预期的坐标。在大多数情况下,一切都应该像以前一样工作,然后您就完成了。但是,您的发布块可能依赖于隐式延迟配置,特别是如果它依赖于在构建的配置阶段可能更改的值。
例如,在新行为下,以下逻辑假设设置jar.archiveBaseName
后不会更改:artifactId
subprojects {
publishing {
publications {
mavenJava {
from components.java
artifactId = jar.archiveBaseName
}
}
}
}
subprojects {
publishing {
publications {
named<MavenPublication>("mavenJava") {
from(components["java"])
artifactId = tasks.jar.get().archiveBaseName.get()
}
}
}
}
如果该假设不正确或将来可能不正确,则artifactId
必须在块内设置afterEvaluate {}
,如下所示:
subprojects {
publishing {
publications {
mavenJava {
from components.java
afterEvaluate {
artifactId = jar.archiveBaseName
}
}
}
}
}
subprojects {
publishing {
publications {
named<MavenPublication>("mavenJava") {
from(components["java"])
afterEvaluate {
artifactId = tasks.jar.get().archiveBbaseName.get()
}
}
}
}
}
[4.8]配置现有wrapper
任务init
您不应该再定义自己的wrapper
任务init
。配置现有任务,例如通过转换:
task wrapper(type: Wrapper) {
...
}
task<Wrapper>("wrapper") {
...
}
对此:
wrapper {
...
}
tasks.wrapper {
...
}
[4.8] Gradle 现在支持 Maven POM 排除中的隐式通配符
如果 Maven POM 中的排除项缺少 agroupId
或artifactId
,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()
更改为返回 aProperty
。 -
setTargetPlatform(NativePlatform)
go掉了。代替使用Property.set()
。 -
getToolChain()
更改为返回 aProperty
。 -
setToolChain(NativeToolChain)
go掉了。代替使用Property.set()
。
-
- 创建静态库
-
-
getOutputFile()
更改为返回 aProperty
。 -
setOutputFile(File)
go掉了。代替使用Property.set()
。 -
setOutputFile(Provider)
go掉了。代替使用Property.set()
。 -
getTargetPlatform()
更改为返回 aProperty
。 -
setTargetPlatform(NativePlatform)
go掉了。代替使用Property.set()
。 -
getToolChain()
更改为返回 aProperty
。 -
setToolChain(NativeToolChain)
go掉了。代替使用Property.set()
。 -
getStaticLibArgs()
更改为返回 aListProperty
。 -
setStaticLibArgs(List)
go掉了。代替使用ListProperty.set()
。
-
- 安装可执行文件
-
-
getSourceFile()
被替换为getExecutableFile()
. -
getPlatform()
被替换为getTargetPlatform()
. -
setTargetPlatform(NativePlatform)
go掉了。代替使用Property.set()
。 -
getToolChain()
更改为返回 aProperty
。 -
setToolChain(NativeToolChain)
go掉了。代替使用Property.set()
。
-
以下也出现了类似的变化:
[4.6] Visual Studio 集成仅支持构建的所有组件的单个解决方案文件
VisualStudioExtension不再具有solutions
属性。相反,您可以通过根项目中的VisualStudioRootExtension配置单个解决方案,如下所示:
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 的人需要注意。