You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打包Gradle依赖以实现Java项目离线构建?

Gradle无网络环境构建:提前打包依赖及插件处理

当然可以提前准备所有依赖,实现无网络环境下的Gradle构建,但直接复制~/.gradle/caches/modules-2/files-2.1目录的方式存在局限性——比如你遇到的com.android.application这类Gradle插件,本身的缓存结构和普通依赖不同,且需要单独处理仓库配置。以下是具体解决方案:

一、批量下载项目所有依赖到指定目录

Gradle可以通过自定义任务,将项目所有编译、运行、测试依赖统一下载到本地目录,方便后续上传到内网仓库:

在项目根目录的build.gradle中添加如下任务:

task downloadAllDependencies(type: Copy) {
    // 遍历所有可解析的配置,覆盖编译、运行、测试等所有依赖场景
    configurations.each { config ->
        if (config.canBeResolved) {
            from config
            into "build/downloaded-dependencies/${config.name}"
        }
    }
}

执行命令触发下载:

./gradlew downloadAllDependencies

执行完成后,build/downloaded-dependencies目录下会包含所有依赖的JAR、POM及校验文件,直接将这些文件上传到内网Artifactory的Maven仓库即可。

二、处理Gradle插件(如com.android.application)的离线支持

com.android.application是Android Gradle插件,不属于普通项目依赖,它的缓存和仓库配置独立于项目依赖:

  1. 提前缓存插件:在有网环境下执行一次完整构建(./gradlew build),Gradle会将插件及其依赖缓存到~/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/${插件版本}目录,该目录下包含插件的JAR文件及相关元数据。
  2. 上传到内网仓库:将上述插件缓存目录的所有文件上传到内网Artifactory的插件专用仓库(或复用现有Maven仓库)。
  3. 配置项目指向内网插件仓库:修改项目根目录的settings.gradle,替换默认插件仓库为内网地址:
pluginManagement {
    repositories {
        maven { url 'http://your-internal-artifactory/plugins-repo' }
        // 注释或删除原有的gradlePluginPortal()
    }
}

三、极简方案:直接复用Gradle完整缓存

如果不想配置内网仓库,可直接将有网环境下的整个~/.gradle目录打包,复制到无网环境的用户目录下,然后执行构建时添加离线参数:

./gradlew build --offline

Gradle会完全使用本地缓存,不会发起任何网络请求。此方法无需额外配置,但缓存目录体积较大(包含所有用过的Gradle版本、插件及依赖)。

四、解决Artifactory中插件只有POM无JAR的问题

你遇到的问题是因为仅复制了插件的POM文件,未同步对应的JAR。正确操作是:

  • 找到插件缓存的完整路径(如~/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/${version}),该目录下包含插件JAR、POM、SHA校验文件等所有必要资源
  • 将这些资源完整上传到内网Artifactory,确保groupId、artifactId、version的目录结构与Maven仓库规范一致

内容的提问来源于stack exchange,提问作者Daniel Walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:32:04