Gradle 5.0:如何修复废弃特性并更新Kotlin项目

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Gradle会报“已废弃特性”以及如何处理?

\n\n

你是否曾经在运行Kotlin项目构建时看到过这条令人不安的消息:此构建中使用了已废弃的Gradle特性,导致其与Gradle 5.0不兼容?如果是——你并不孤单。这个问题在Stack Overflow上已有数千次浏览,今天我们将对其进行全面剖析。

\n\n

想象一下:你用Kotlin编写代码,一切运行正常,但Gradle突然开始闹脾气。它说:“嘿,你正在使用一些旧功能,我将在5.0版本中移除它们!”这就像你最喜欢的咖啡机突然告诉你,明天它将不再接受旧杯子。虽然令人不快,但问题是可以解决的。

\n\n

在本文中,我们不仅会展示如何消除这个错误。我们还将比较三种解决方法:从快速的“打补丁”式方法到专业的重构。你将了解为什么Gradle认为你的代码已过时,以及如何用现代方式重写它。

\n\n

Gradle中的废弃特性是什么?

\n\n

废弃(已过时)功能是指Gradle开发者计划在未来移除的API部分。它们是为了向后兼容而保留的,但不再推荐使用。当你看到这个警告时,Gradle实际上是在说:“你的项目现在可以构建,但升级到5.0版本后就不行了。”

\n\n

问题通常出在以下几个方面:

\n
    \n
  • 过时的插件(例如旧版本的kotlin-gradle-plugin)
  • \n
  • 隐式依赖(使用compile而不是implementation)
  • \n
  • 未适配Kotlin DSL的Groovy脚本
  • \n
  • 在build.gradle中直接调用已废弃的方法
  • \n
\n\n

方法1:快速解决方案——抑制警告

\n\n

最简单(但并非最正确)的方法就是告诉Gradle:“闭嘴,干活。”这就像用胶带把发动机故障灯贴住。车能开,但问题依然存在。

\n\n

在build.gradle.kts(Kotlin DSL)中添加以下代码块:

\n\n
tasks.withType<Wrapper> {\n    gradleVersion = "4.10.3" // 冻结版本\n}\n\n// 或者抑制警告\nallprojects {\n    tasks.withType<AbstractCompile> {\n        options.isDeprecation = false\n    }\n}
\n\n

优点:快速,无需修改代码,构建可通过。

\n

缺点:你没有解决问题,只是推迟了。升级到Gradle 5.0+后项目会崩溃。此外,你会错过重要的性能和安全性改进。

\n\n

何时使用:仅当你急需构建项目且没有时间进行重构时。但务必计划好正常的解决方案。

\n\n

方法2:迁移到现代配置

\n\n

这是“中庸之道”。你不仅仅是堵住错误,而是让项目变得井然有序。让我们以Kotlin项目为例,分析典型问题。

\n\n

将compile替换为implementation/api

\n\n

声明依赖的旧方式——compile——早在Gradle 3.0中就已废弃。请改用implementation和api。

\n\n

之前(Groovy):

\n
dependencies {\n    compile 'org.jetbrains.kotlin:kotlin-stdlib:1.3.72'\n    compile 'com.squareup.retrofit2:retrofit:2.9.0'\n}
\n\n

之后(Kotlin DSL):

\n
dependencies {\n    implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")\n    implementation("com.squareup.retrofit2:retrofit:2.9.0")\n}
\n\n

区别很简单:implementation对模块的使用者隐藏依赖关系,从而加快构建速度。api则使其可见,就像旧的compile一样。

\n\n

更新Kotlin插件

\n\n

旧版本的kotlin-gradle-plugin经常使用已废弃的Gradle API。请查看kotlinlang.org上的最新版本并进行更新

博客

书籍推荐