Gradle Wrapper 默认每次执行都会发起 HEAD 请求检查远程发行包,即使本地已缓存完整;可通过在 gradle-wrapper.properties 中添加 org.gradle.wrapper.disable.check=true 彻底禁用该检查。

Gradle Wrapper 默认每次执行都会检查网络,即使本地已有对应版本的发行包
为什么 gradlew 启动时仍会发起 HTTP 请求
Gradle Wrapper 的默认行为是:每次运行 gradlew 时,先向 DISTRIBUTION_URL(如 https://services.gradle.org/distributions/gradle-8.10-bin.zip)发起 HEAD 请求,验证远程文件是否存在且未被篡改。这个检查由 GradleWrapperMain 中的 checkDistributionUrl 逻辑触发,与本地缓存是否完整无关。
- 该检查不下载文件,但依赖网络连通性;若公司内网屏蔽了
services.gradle.org,就会卡住或报java.net.UnknownHostException - 即使
~/.gradle/wrapper/dists/gradle-8.10-bin/xxx/下已解压好全部内容,检查仍会发生 - 仅当配置了
org.gradle.wrapper.disable.check=true(见下文)才跳过
如何彻底禁用 Wrapper 的网络检查
在项目根目录的 gradle/wrapper/gradle-wrapper.properties 文件末尾添加:
org.gradle.wrapper.disable.check=true
注意:
- 该配置仅影响当前项目的
gradlew脚本,不影响其他项目 - 必须写在
gradle-wrapper.properties中,环境变量或 JVM 参数无效 - 添加后,Wrapper 将完全跳过远程校验,直接使用本地缓存的
gradle-*.zip和解压目录 - 如果本地缓存损坏(比如解压中断),会直接失败,不再尝试重下——这点容易被忽略
缓存路径和手动预置发行包的实用技巧
Gradle Wrapper 解压后的运行时目录结构固定,例如:
~/.gradle/wrapper/dists/gradle-8.10-bin/7z2j9qk4n5v3m8x6y1t0r2s5u/gradle-8.10/
你可以:
- 提前在离线环境把
gradle-8.10-bin.zip放到对应dists/gradle-8.10-bin/xxx/目录下(xxx 是校验码子目录名,可从其他机器复制) - 用
unzip -t检查 zip 完整性,避免解压失败却无提示 - 不要手动删除
gradle-8.10/目录而保留.zip——Wrapper 不会自动重解压,必须删整个子目录再运行一次gradlew才触发
真正要稳住离线构建,光靠“有缓存”不够;得确认 disable.check 开启 + .zip 完整 + 子目录名匹配三者同时成立。缺一环就可能在 CI 或新员工机器上突然断掉。











