ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Gradle 5.6.2-all.zip 下载与老项目构建兼容指南

Gradle 5.6.2-all.zip 下载与老项目构建兼容指南 简介Gradle 5.6.2-all.zip 是面向 Java/JVM 项目的完整构建工具发行包适合需要固定版本构建环境的开发者、运维或 CI 配置人员尤其适合内网离线部署场景。该版本为 5.6 系列修正版修复了两个 5.6.1 遗留问题解决 Gradle 5.6 及以上版本生成 .classpath 文件时出现的重复条目问题以及使用 Worker API 并启用进程隔离时产生的内存泄漏从而提升 Eclipse 导入和并行任务场景下的稳定性。压缩包约 134.42MB内含可执行脚本、核心依赖库、内置插件、API 文档及示例项目解压配置后即可运行 Gradle 命令免去在线安装的等待与不确定。包内目录沿用发行版标准布局bin 存放启动脚本lib 集成 Groovy 与 Kotlin 等依赖方便按需检索。已有 419 人浏览学习可作为构建升级、回退对照或离线分发的便捷来源。1. gradle-5.6.2-all.zip 快速下载老项目构建兼容性的第一道关口接手一个 2020 年左右的 Spring Boot 或 Android 老项目第一道坎往往不是代码而是 Gradle 版本。项目里的 gradle-wrapper.properties 还指向旧发行版你本地的 Gradle 则是新装的一构建就翻车。gradle-5.6.2-all.zip 解决的就是这类问题它支持 JDK 8 到 12能顺畅配合 AGP 3.5.x 和 Spring Boot 2.3.x 的构建配置是 2020 年前后老项目最不容易出错的 Gradle 版本之一。这份资源是 5.6.2 的 all 版离线安装包里面带完整源码和文档排查插件问题比 bin 版省事得多。适合维护老项目的后端和 Android 开发、被 Gradle 版本问题折腾到头疼的新手以及要在无外网环境搭构建服务的同学。2. 版本选型逻辑为什么锁定 5.6.2而不是 6.x 或 7.x判断一个 Gradle 发行包该不该用最基本的方法不是看新不新而是看项目里另外几样东西的版本。JDK、Android Gradle PluginAGP、Spring Boot 插件这三者会联合锁死 Gradle 的可用范围。5.6.2 之所以在 2020 年前后这批项目里频繁出现是因为它刚好落在几个兼容区间的交集上向上兼容到 JDK 12向下对 JDK 8 老项目非常友好AGP 3.5.x 系列要求 Gradle 5.5它满足Spring Boot 2.3.x 的 Gradle 插件官方也是按 5.x 配的。这不是玄学是版本矩阵里能查到的对应关系只是很少有人愿意在下载之前先查一遍。2.1 兼容性三角JDK、AGP 与 Spring Boot 版本锁选 Gradle 版本实际是被三个约束共同推着走的。JDK 决定你能不能跑起这个 GradleAGP 或 Spring Boot 插件决定 Gradle 能不能正确处理构建脚本。Gradle 5.6.2 支持 JDK 8 到 12这在 5.x 时代是相当宽的范围对 Android 项目AGP 3.5.x 官方要求 Gradle 5.5 以上5.6.2 不但满足而且比最低要求高一个小版本稳定性更稳。对后端老项目Spring Boot 2.3.x 用的是 Gradle 5.x 的插件 API拿 4.x 或 6.x 都可能出现脚本方法识别问题。约束维度与 Gradle 5.6.2 的兼容关系JDK 8完全支持老项目主力环境JDK 11 / 125.6 分支开始较好支持AGP 3.5.x官方最低 Gradle 5.55.6.2 可用AGP 3.6.x官方要求 5.6.45.6.2 不满足Spring Boot 2.3.x官方工具链匹配 Gradle 4.10 到 5.x注意表格里有一行“AGP 3.6.x”直接说明 5.6.2 不够这种“差一点点”的情况最坑。如果你项目里插件版本是 AGP 3.6.0建议直接换 5.6.4而不是 5.6.2。反过来如果插件版本是 AGP 3.5.x5.6.2 完全够用。网上常见提问“androidstudio build:gradle:7.0.4 下载哪个版本”答案很简单AGP 7.0.x 对应 Gradle 7.x不要往回找 5 系列。我遇到过最典型的场景是团队来了新人把 AGP 3.5.2 项目拿到 Gradle 7 的环境里跑报一堆 DSL 方法不识别反过来把新版 AGP 7.0.4 项目拿到 5.6.2 上跑直接提示 Gradle 版本不足。这两个方向我都吃过亏。所以在下载任何发行包之前先把项目里的插件版本摸清楚比到处问“哪个版本最稳定”靠谱得多。2.2 用构建报错反向锁定版本三个可复现的命令如果项目没有任何文档怎么判断该装哪个 Gradle最常见的方式是先用构建报错反向锁定。拉起项目后如果看到 “Minimum supported Gradle version is X.X”说明当前 Gradle 低了如果看到 “Gradle version X is required”说明要求更具体。在我这里拿到一个新项目会依次跑三个命令。gradle --version这是看本机全局 Gradle 版本只包含当前环境的信息不能用来判断项目要求。真正决定项目用哪个版本的是 wrapper 里那个 URL。cat gradle/wrapper/gradle-wrapper.properties这条命令会输出 distributionUrl例如https\://services.gradle.org/distributions/gradle-5.6.2-all.zipgradle-5.6.2就是项目锁定的版本。无论你全局装什么项目只要用了gradlew脚本实际构建都会以这里的版本为准。grep -E com.android.tools.build:gradle|org.springframework.boot build.gradle这条用来确认插件版本。看到com.android.tools.build:gradle:3.5.2按官方兼容表应当配 Gradle 5.5看到3.6.0则要 5.6.4。Spring Boot 项目则看org.springframework.boot的版本2.3.x 就落在 5.x 区间。下面给一个简化版兼容表便于快速对照AGP 版本最低 Gradle 版本3.5.x5.53.6.x5.6.44.0.x6.1.17.0.x7.0需要注意的是这里是“最低”而非“推荐”。差一个小版本通常问题不大但如果项目里 AGP 锁了 3.6.0那还是老老实实用 5.6.4 更稳。如果三个命令跑完还是拿不准就把 build.gradle 里插件版本、wrapper 里的版本号、JDK 版本三个信息贴到搜索引擎里基本能定位到同款组合的踩坑记录。2.3 5.6.2 与 5.6.4补丁版本怎么选5.6.2 和 5.6.4 都属于 5.6 分支核心 API 一致构建脚本一般不用改。区别主要在修补上例如增量编译的某些边界情况、daemon 内存回收等。对大多数老项目这两个版本表现出来几乎是同一回事。如果你手头已经有一批 Gradle 5.6.2 的本地缓存或者团队的 CI 镜像里预置了 5.6.2那直接沿用最省事。硬升到 5.6.4 并不会带来可感知的收益反而可能让缓存作废。反过来如果项目明确要求 5.6.4例如 AGP 3.6.0 场景就别为了省下载而强行用 5.6.2。还有一个小细节容易被忽略~/.gradle/wrapper/dists里可能已经存在另一个项目下载好的 5.6.2 完整发行包。这种情况下当前项目并不需要重新下载只要 wrapper 的 URL 指向 5.6.2Gradle 会自动复用缓存目录里的内容。很多人以为修改 wrapper 版本就一定要联网拉包其实本地缓存命中的话整个过程是静默完成的。我一般的原则是没有被某个具体报错逼着升级就不再动 Gradle 版本。老项目最怕的是“升级一时爽缓存火葬场”。确定版本后下一件事就是把 zip 快速下载到本地这一步的镜像选择和校验也有讲究。3. 快速下载 gradle-5.6.2-all.zip镜像源、校验与离线包落地下载这步看着简单实际上坑最多的是“下下来不能用”。Gradle 安装包不是解压就能用还要考虑镜像可用性、文件是否完整、解压到哪、环境变量配在哪一层。这一章按我实际操作的顺序来先挑下载源再校验再解压配置最后把离线包分发到没外网的机器。3.1 官方源与国内镜像一条命令完成下载Gradle 官方发行包统一放在https://services.gradle.org/distributions/如果外网访问不稳定用国内镜像反而快。常用的国内镜像有腾讯云和华为云路径和官方一致直接替换域名即可。wget -c https://mirrors.cloud.tencent.com/gradle/gradle-5.6.2-all.zip -O gradle-5.6.2-all.zip-c支持断点续传下载中断后重跑会从断点继续而不是从头再来-O指定输出文件名避免镜像返回的默认名字不一致。curl -L -o gradle-5.6.2-all.zip https://mirrors.huaweicloud.com/gradle/gradle-5.6.2-all.zip-L跟随重定向部分镜像会先跳到对象存储-o指定保存文件名。两条命令任选其一没有 wget 就 curlWindows 的 PowerShell 里也原生支持 curl。再强调一下为什么选 all 而不是 bin。bin版只有可执行程序all版还带 Gradle 自身源码、文档、示例工程。编译报错时用 IDE 打开源码定位坑位会方便很多离线环境里尤其值得。如果只是 CI 里跑构建而且磁盘空间紧张bin 版也可以但作为本地开发环境我始终建议 all。3.2 校验、解压与规范目录下载完后不要急着解压。先校验一遍防止文件损坏或者镜像同步出问题。sha256sum gradle-5.6.2-all.zip官方发布页的 checksum 区域可以查到每个版本的 SHA-256把输出值和官网上的字符串比对。这一眼不花时间但能拦住解压到一半报“unexpected EOF”的尴尬。Windows 下可以用certutil -hashfile gradle-5.6.2-all.zip SHA256效果一样。unzip -q gradle-5.6.2-all.zip -d /opt/gradle/ mv /opt/gradle/gradle-5.6.2 /opt/gradle/gradle-q静默解压避免刷一屏文件名-d指定目标目录。这里解压到/opt/gradle/并改名为gradle是为了后面环境变量路径稳定。如果你机器上已经有别的 Gradle不要直接改名覆盖用/opt/gradle/gradle-5.6.2作为全路径更清晰。解压完最好确认一下目录结构完整ls /opt/gradle/gradle/bin正常情况下能看到gradle和gradle.bat两个启动脚本以及lib、docs、samples等目录。bin下没有启动脚本说明解压不完整重新校验再解压。这个检查可以在配置环境变量之前拦截掉一半的“明明装了却不能用”问题。3.3 配置环境变量Linux、macOS 与 Windows 两套姿势Linux 和 macOS 的做法一致打开~/.bashrc或~/.zshrc追加两行export GRADLE_HOME/opt/gradle/gradle export PATH$GRADLE_HOME/bin:$PATHGRADLE_HOME指向解压根目录PATH里加上bin后续执行gradle命令才能找到可执行文件。改完执行source ~/.bashrc生效。Windows 下面在 PowerShell 里执行[Environment]::SetEnvironmentVariable(GRADLE_HOME, C:\gradle\gradle-5.6.2, User) [Environment]::SetEnvironmentVariable(Path, %GRADLE_HOME%\bin; [Environment]::GetEnvironmentVariable(Path, User), User)第一行把用户级GRADLE_HOME设成解压目录第二行把%GRADLE_HOME%\bin追加到用户Path的最前面。注意不要直接拼$env:Path否则可能把系统 PATH 里的内容混进用户 PATH。也可以在“系统属性 → 环境变量”界面里手动加效果一样。Windows 下如果用 cmd 窗口临时验证直接在命令行执行set GRADLE_HOMEC:\gradle\gradle-5.6.2只对当前窗口有效别拿这个当持久化配置。配置完验证一下gradle -v能看到版本号、JVM、系统信息就说明安装成功。如果提示command not found多半是终端没重开或者 PATH 没刷新。控制台窗口在环境变量修改后不会自动重新加载关掉重开是最快的排查手段。除了GRADLE_HOMEGradle 还会用GRADLE_USER_HOME这个变量默认在用户目录下的.gradle。wrapper 下载的分发包、项目依赖缓存都放在这里后面避坑部分会反复提到这个目录。3.4 离线包落地从一台有网机器向内网分发如果开发机完全在隔离网络另一个常见做法是在一台能联网的机器上把 zip 下载好再通过内网传过去。这一步不涉及复杂工具一个 rsync 就够。rsync -av gradle-5.6.2-all.zip user192.168.1.20:/opt/gradle/-a归档模式保留文件属性-v显示进度目标路径要确保有写权限。传完之后在目标机器上按 3.2 到 3.3 的步骤解压、配置即可。Windows 之间拷贝直接复制到共享目录也行没有硬性要求。这里要多说一句下载好的 zip 不要急着删。Gradle wrapper 首次构建时会在~/.gradle/wrapper/dists里保留一份 zip 缓存如果本地已经有这个包后续项目复用它就能省一次下载。尤其在内网分发场景里这个包本身就是团队的公共资产。更省事的办法是直接用 HTTP 把包分享出去这样团队每台机器都能用distributionUrl指向内网地址连拷贝都省了。这个思路放到最后一章详细展开。4. 把 5.6.2 跑起来init 脚本加速、Wrapper 锁定与命令行提速装好 Gradle 只是开始。实际构建中依赖下载慢、项目动不动拉错版本、命令参数不对导致全量重编这些才是真正让人摔跟头的地方。这一章讲三件事用 init 脚本统一仓库镜像、用 wrapper 锁死项目版本、把常用构建参数调顺。4.1 init.gradle把依赖仓库全局指向国内镜像Gradle 5.x 的老项目默认仍会访问 jcenter而 jcenter 已经停止更新许多依赖现在拉不动。最省事不是逐个改每个项目的repositories而是让 init 脚本对当前机器上所有构建生效。allprojects { repositories { maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin } mavenCentral() } } allprojects { buildscript { repositories { maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/gradle-plugin } } } }第一段处理项目依赖仓库public 聚合了 Maven Central 和部分旧仓库google 是 Android 项目必须的gradle-plugin 对应 Gradle Plugin Portal。第二段处理构建脚本本身需要的插件像com.android.tools.build:gradle就是从这里解析。文件放在$GRADLE_HOME/init.d/init.gradle或~/.gradle/init.d/init.gradle均可前者对所有使用这套 Gradle 的人生效后者只对当前用户生效。有一点要注意init.gradle 是对仓库列表做追加不是强制删除原有仓库。如果某个模块的 build.gradle 里写了jcenter()Gradle 还是会去访问 jcenter只是多了一个镜像可选。所以项目里的jcenter()能删就删或者把它挪到repositories最后一行避免解析依赖时优先撞上慢源。老项目里jcenter()卡住的典型表现是构建日志停在 “Downloading...” 不动等待时间长得让人怀疑机器死机。4.2 修改 gradle-wrapper.properties固定版本wrapper 文件的路径是gradle/wrapper/gradle-wrapper.properties。里面最关键的只有最后一行。distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-5.6.2-all.zipdistributionBase和distributionPath决定解压后的 Gradle 放在哪默认是~/.gradle/wrapper/distszipStoreBase和zipStorePath决定 zip 缓存位置distributionUrl是真正下载的地址。末尾那个版本号就是项目锁定的 Gradle 版本。如果已经手动下载好 5.6.2把 URL 改成镜像地址distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-5.6.2-all.zip也可以直接指向本地文件Windows 下注意路径格式distributionUrlfile\:///D:/gradle-dist/gradle-5.6.2-all.zipfile\:///这里的三个斜杠是协议格式第一个斜杠紧跟盘符后两个是路径前缀。Linux 下同理写成file\:///opt/gradle-dist/gradle-5.6.2-all.zip。改完保存再执行./gradlew build就会用这个版本构建不再去官网下载。改完怎么确认生效直接看构建日志的前几行Gradle 会打印当前发行版路径和版本号对应到gradle-5.6.2-all就说明读到了新配置。如果日志里还是旧版本检查一下有没有代理环境变量或者全局配置覆盖了 wrapper 设置。4.3 命令行构建提速跳过测试、并行与离线参数老项目全量构建动辄几分钟其中大半时间花在依赖下载和顺序执行上。常用参数是这样一组组合gradle build -x test --parallel --max-workers4 --consoleplain-x test跳过测试任务适合只想确认编译是否通过的场景--parallel让多个模块并行构建--max-workers4把并发 worker 限制在 4避免内存被撑爆--consoleplain输出纯文本日志终端里不会反复刷进度条。并行参数是有内存代价的。--max-workers设太高例如 8遇到大项目容易直接 OOM。我一般是先看机器内存16GB 的机器设 432GB 以上才设 6 或 8。老项目尤其要谨慎因为 AGP 3.5 时代的构建性能本身就不如新版并行度拉满反而更容易翻车。依赖已经全部缓存后可以加--offline强制离线构建gradle build --offline离线模式下 Gradle 不会发起任何网络请求速度明显更快但它有个前提所有依赖都已经在~/.gradle/caches里。第一次构建时不要用这个参数否则依赖解析阶段会直接报 “Cached resource not found”反而更慢。通常我会先联网跑一次构建把缓存打满之后再进入离线模式。4.4 多项目多版本共存GRADLE_HOME 与 wrapper 的协作这里有一个经常被误解的机制。命令行输入gradle用的是GRADLE_HOME下的版本而进入带 wrapper 的项目执行./gradlew用的是 wrapper 指定的发行版。两者不是同一套东西。命令实际版本来源典型用途gradle$GRADLE_HOME 全局版本临时构建、执行 init 脚本./gradlewwrapper/dists 中对应 distribution项目级正式构建所以全局装 5.6.2 并不会自动让一个 wrapper 指向 8.x 的项目改用 5.6.2。要让项目整体切到 5.6.2最直接的方式是改 4.2 节的distributionUrl或者用一条命令重新生成 wrappergradle wrapper --gradle-version 5.6.2 --distribution-type all该命令会重写gradle-wrapper.properties并把gradlew、gradlew.bat等文件同步更新到项目里。--distribution-type all指定 all 发行版和手下载的 zip 保持一致。执行完再看 wrapper 文件URL 已经变成 5.6.2。这样全局版本和项目版本各司其职互不干扰。还有一点和 git 协作相关gradlew、gradlew.bat以及gradle/wrapper/下的两个文件要提交到代码仓库但~/.gradle/wrapper/dists里的内容千万不要提交。dists 是本地缓存每台机器自行下载即可放进版本库只会让仓库变得笨重还会因为 hash 目录不同引发冲突。5. 避坑实录distribution 下载失败、DSL 方法找不到、缓存损坏版本挑对了、包也下载好了构建过程还是有一堆经典报错等着你。这一章写的是我在 5.6.2 场景里反复见过的问题每一条都按现象、原因、解决三步来。它们大多数不是代码问题而是环境问题或者新旧语法混用问题。5.1 Could not install Gradle distribution from gradle-8.13-bin.zip现象拿一个新拉下来的项目首次构建报错信息指向某个较高的版本号Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.13-bin.zip.原因wrapper 按distributionUrl去下载发行包但网络访问下载站点失败或响应极慢也可能下载中断后留下半截 zipGradle 检测到文件名存在就不再重下直接解压失败。解决先改distributionUrl把官方地址换成国内镜像或本地文件参照 4.2。如果已经确定项目要用 5.6.2直接改成 5.6.2 的 all 包。第二步清掉可能损坏的缓存目录rm -rf ~/.gradle/wrapper/dists/gradle-8.13-bin/然后重新./gradlew build。dists 目录里那个 hash 子目录是 Gradle 根据 URL 算出来的删掉不会影响其他版本。如果不清下次构建可能复现同一个错误。看到.lck锁文件和.part未完成文件基本可以断定是缓存损坏。有人会想“我手动下载了 zip直接放进 dists 目录行不行”。这个思路可以但要注意zip 必须放在 hash 子目录里而 hash 是 Gradle 根据 URL 计算的手动放错位置不会被识别。与其折腾 hash 目录不如直接用file://URL 指向本地 zip让 Gradle 自己处理缓存省心很多。5.2 Gradle DSL method not found: minsdkversion()现象Android 项目构建时脚本编译报错Error: Gradle DSL method not found: minsdkversion()原因最常见的是方法名大小写不对正确写法是minSdkVersionGroovy 对大小写敏感其次是compileSdkVersion、minSdkVersion这类 DSL 方块要求com.android.application插件先应用没 apply 插件就会报找不到方法第三种隐蔽情况是 Gradle 和 AGP 版本不匹配例如 AGP 7.0.4 搭配 Gradle 5.6.2AGP 的 DSL 在旧 Gradle 上根本注册不进去。解决第一件事把大小写改对。android { compileSdkVersion 30 defaultConfig { minSdkVersion 21 targetSdkVersion 30 } }第二件事确认模块顶部的插件声明存在apply plugin: com.android.application第三件事对照第 2 章的兼容表检查 Gradle 与 AGP。AGP 7.0.4 的项目必须用 Gradle 7.x不要指望靠 5.6.2 硬扛。这三个检查做完基本能定位到是哪一类原因。这个报错通常在构建脚本编译阶段就抛出来堆栈顶部能看到org.gradle.api.GradleException一类的异常。看到异常类再往上翻脚本行号比盲改更快。如果报错信息里没有明确行号优先怀疑插件版本不匹配因为脚本方法名错误通常会跟一个Possible solutions提示。5.3 Deprecated Gradle features were used in this build现象构建成功但每次末尾都出现一条警告Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.原因Gradle 5.6.2 时代项目里的 build.gradle 或某个第三方插件还在用旧 API比如compile依赖配置、未转义的仓库写法。Gradle 6 之后这些特性不再兼容所以它提前警告。注意这里只是 warning不是 error构建结果不受影响。解决如果构建成功且短期没有升级 Gradle 的计划可以先不管。要看具体来源加参数重新跑./gradlew build --warning-modeall日志里会标记出是哪一句脚本触发的警告。如果是自己写的 build.gradle把compile换成implementation或api如果是第三方插件内部行为那只能升级插件但升级插件又可能要求更高 Gradle 版本等于回到版本选型问题。我的原则是构建能过、没人要求升 6.x就按捺住手不折腾。用--warning-modeall跑一次全量构建日志会变得非常长建议同时加上--consoleplain把输出重定向到文件再慢慢看./gradlew build --warning-modeall --consoleplain build.log 21然后搜索Deprecated关键字定位具体任务。不要直接盯着终端滚动容易漏掉关键行。5.4 Could not get resource依赖解析卡在与仓库的连接上现象构建卡在Downloading...很久随后报出Could not resolve all dependencies for configuration :compileClasspath.原因老项目的repositories里写了jcenter()而 jcenter 已经处于只读状态部分旧依赖解析时连接超时另外一些项目直接访问 Maven Central 也慢。Gradle 5.6.2 默认对仓库选择不敏感哪个源能用取决于你写不写。解决按 4.1 的 init.gradle 把仓库统一换成国内镜像同时把 build.gradle 里这行改一下repositories { maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin } }把jcenter()删掉或者移到这段代码之后。镜像仓库和原仓库同时存在时Gradle 会按声明顺序找依赖把快的镜像放前面是关键。另外--info参数可以打印每个仓库的解析耗时定位到底卡在哪个源。动手改之前可以先确认镜像本身可达curl -I https://maven.aliyun.com/repository/public/返回200 OK说明镜像服务正常问题出在项目仓库配置如果镜像也不通那就要先解决网络层面的问题再回来改脚本。老项目里经常同时挂着jcenter()、mavenCentral()、google()三个源解析顺序越靠前的源越容易被请求把 jcenter 放在第一位基本等于每次解析都先撞一次慢源。5.5 Flutter 老项目apply 命令式插件加载的冲突现象Flutter 项目在 android 目录执行构建提示You are applying Flutters main Gradle plugin imperatively using the apply script method...原因Flutter 早期模板在 build.gradle 里用apply from: ...这类命令式写法加载 Flutter 的 Gradle 脚本新版本 Flutter 工具链则要求插件用pluginsDSL 声明。两种加载方式混在一起时Gradle 会认为你在用已经废弃的加载姿势给出这段提示。解决把 android 目录 build.gradle 里那种apply from的加载语句移除统一改用plugins块声明。具体写法跟 Flutter 版本有关建议先看项目里的settings.gradle是否已经有plugins { id ... }有的话直接照搬。如果你把 Gradle 从 8.x 降到 5.6.2问题还在不要继续降版本问题不在版本而在加载姿势。同样的报错在 Android 原生项目里也可能出现如果你手写了apply plugin: com.android.application而项目本身又在 settings.gradle 里通过plugins声明了同一个插件两边就会打架。老项目里apply写法很常见新模板则统一走plugins总原则是同一个插件只保留一种声明方式。6. 进阶把本机变成团队的内网 Gradle 源最后这一步Gradle 5.6.2 已经从“下载一个 zip”变成了团队基础设施。做法很简单用一台内网机器当静态文件服务器把 gradle-5.6.2-all.zip 放在目录里所有成员的 wrapper 都指向内网地址。这样闭着眼睛都知道首次构建会在哪里下发行包速度稳定也不占外网带宽。mkdir -p /opt/gradle-dist cp gradle-5.6.2-all.zip /opt/gradle-dist/ python3 -m http.server 8080 --directory /opt/gradle-dist--directory指定站根目录端口按团队现状挑个不冲突的。这个命令适合临时验证常驻服务我更推荐 nginxserver { listen 8080; root /opt/gradle-dist; autoindex on; }autoindex on允许列出目录这样团队成员直接复制文件路径不用问你要地址。然后把项目里的 wrapper URL 改成内网地址distributionUrlhttp\://192.168.1.100:8080/gradle-5.6.2-all.zip注意 URL 里的\:转义保留192.168.1.100换成实际机器 IP。改完后首次构建会从内网拉包之后 Gradle 会把 zip 缓存到 dists后续构建不再重复下载。整个内网源既可以分发 5.6.2也可以同时放多个版本的 zip团队里其他老项目也能复用。如果连内网服务都不想搭还可以直接把 zip 预置进~/.gradle/wrapper/dists。这个思路更省事但要注意目录里有哈希子目录手动放容易放错位置。我早年在一台内网机器上配环境图省事没清干净 dists结果构建花了半小时才定位到是僵尸文件在捣鬼。从那以后我每次给老项目搭环境都强制走一遍先确认 distributionUrl再清理 dists 缓存最后用--offline验证一次。希望帮到你。本文还有配套的精品资源点击获取
返回列表