如何完全离线构建Gradle项目?Linux+JDK11+Gradle5.0缓存失效问题求解
问题根因
你遇到的问题本质是构建脚本(classpath)依赖未被完整缓存,或是跨机器复制时缓存元数据失效,具体触发原因有3个:
- 在线构建时部分构建插件的依赖是按需加载的,你虽然在原机器完成了构建,但复制缓存前没有停止Gradle守护进程,部分缓存文件未完全落盘导致复制内容不全
- 你使用的Gradle 5.0版本缓存元数据会绑定当前机器的路径、用户信息,跨机器复制时元数据校验失败,导致Gradle不识别已存在的jar包
- 你复制的
~/.gradle目录仅包含了项目运行时依赖,没有包含buildscript块声明的构建插件及其传递依赖;而可正常跨机器构建的FlatLaf项目没有引入第三方构建插件,所有构建逻辑用Gradle内置能力实现,所以没有触发该问题。
解决方案
方案1:兼容现有Gradle 5.0版本(无需改版本)
- 在线环境预构建时先停止所有Gradle守护进程,执行
buildEnvironment任务强制下载所有构建脚本依赖,确保所有缓存落盘
gradle --stop ./gradlew buildEnvironment ./gradlew clean build
- 不要直接依赖
~/.gradle的全局缓存,改用本地maven目录存所有依赖,规避跨机器元数据校验问题。在项目根目录的build.gradle开头添加如下配置:
buildscript { repositories { // 优先读取项目本地的maven依赖目录 maven { url "${rootProject.projectDir}/maven-local" } } } allprojects { repositories { maven { url "${rootProject.projectDir}/maven-local" } } }
- 在线环境执行命令将所有依赖导出到项目本地maven目录:
./gradlew publishToMavenLocal -Dmaven.repo.local=./maven-local
- 把整个项目连同
maven-local目录一起拷贝到离线机器,直接执行构建即可:
./gradlew --offline clean build
方案2:升级Gradle到7.x版本(更稳定,兼容JDK11)
Gradle 6.0之后优化了离线缓存的跨机器兼容性,缓存元数据不再绑定机器信息,操作更简单:
- 在线环境先将项目Gradle wrapper升级到7.6版本(兼容JDK11的最新稳定版)
./gradlew wrapper --gradle-version 7.6 gradle --stop # 执行完整构建后停止守护进程再复制缓存 ./gradlew clean build gradle --stop
- 跨机器完整复制
~/.gradle目录,确保两台机器Gradle版本完全一致,离线构建时添加参数规避缓存校验即可:
./gradlew --offline --no-build-cache clean build
内容的提问来源于stack exchange,提问作者Ekaterina Ivanova iceja.net
相关产品推荐
相关产品推荐

