Gradle 仓库及插件依赖代理镜像加速设置

12,204 阅读3分钟

前言

Gradle 作为最常用的项目构建工具之一,Android 和 Java 相关的开发者在日常的工作中肯定是经常打交道的。由于无形的墙或本地复杂的网络环境,会导致依赖编译工具依赖插件或库文件下载缓慢或直接无法下载,项目无法编译打包。这时我们就可以通过设置下载镜像来解决这些问题,我们可以选择配置成公司或自己搭建的 Maven 服务,或者是使用公有云服务商的 Maven 镜像服务,比如阿里云或腾讯云等。这里是以使用阿里云为例,自建和其他的也是类似的设置方式,只是仓库的地址不同。

如何判断依赖插件或库文件无法下载

通常情况下,文件下载不了 Gradle 会直接报错显示到控制台窗口,这种情况就很容易看出问题;但是,有时候 Gradle 并没有报错,一切都看似正常的执行,只是处理 进度一直不动 或卡在某个 Task 里,这时可能就是某些文件下不来导致的。如何查看呢?在项目根目录下执行 Gradle 的脚本任务时加上 --debug 就可以看到 Gradle 编译时执行步骤的详细信息,这里面就可以看到相关的下载信息,可能输出信息会有点多。

# Windows 环境下执行
./gradlew.bat --debug

# *unix/Mac 环境下执行
./gradlew --debug
# 或
bash ./gradlew --debug

构建插件镜像加速

  • 全局配置

如果你没有设置 GRADLE_HOME 环境变量的话,默认情况下在用户目录下的 .gradle/ 文件夹下创建文件 init.gradle (这个文件默认是没有创建的,需手动创建),添加以下配置信息即可

settingsEvaluated { settings ->
    println "aliyun pluginManagement"
    settings.pluginManagement {
        repositories {
            maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
            maven { url "https://maven.aliyun.com/repository/spring-plugin" }
            gradlePluginPortal()
        }
    }
}
  • 项目级配置

在项目的根目录下 <project>/settings.gradle 文件中第一行加入,注意这配置必须要放在开头

pluginManagement {
    println "aliyun pluginManagement"
    repositories {
            maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
            maven { url "https://maven.aliyun.com/repository/spring-plugin" }
            gradlePluginPortal()
    }
}

常规依赖库镜像加速

  • 全局配置 用户根目录下/.gradle/init.gradle
buildscript {
    repositories {
        println "aliyun repositories"
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/public' }
    }

    allprojects {
        println "aliyun allprojects ${project.name}"
        repositories {
            maven { url 'https://maven.aliyun.com/repository/google' }
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
        }
    }
}
  • 项目级配置 项目根路径/build.gradle 这里以 Spring Boot 为例,Android 项目也是类似
buildscript {
    ext {
        springBootVersion = '2.0.6.RELEASE'
    }
    repositories {
        maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
        maven { url "https://maven.aliyun.com/repository/spring-plugin" }
        gradlePluginPortal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.jacknic'
version = '1.0.0'
sourceCompatibility = 1.8

repositories {
        println "aliyun repositories ${project.name}"
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/public' }
}

dependencies {
    testImplementation('org.springframework.boot:spring-boot-starter-test')
    implementation('org.springframework.boot:spring-boot-starter-web')
}

验证设置是否生效

在项目根路径下执行 .\gradlew.bat 就可以看到以下输入,可以看到我们在配置代码块的闭包中写的 println "aliyun xxxx" 字样的信息在控制台中打印出来,或者查看详细的信息还可以使用 --debug 参数,这样可以看到相关依赖文件的下载链接地址,这样就可以判断文件是否是从镜像站下载的

PS D:\dev\company\project> .\gradlew.bat
aliyun repositories
aliyun pluginManagement
aliyun allprojects app
aliyun allprojects module1
aliyun allprojects module2
aliyun allprojects module3

> Configure project :...
......

完整配置

  • 全局配置 在用户根目录下 /.gradle/init.gradle 或者是你已配置的 $GRADLE_HOME/init.gradle
// gradle全局配置
settingsEvaluated { settings ->
    println "aliyun pluginManagement"
    settings.pluginManagement {
        repositories {
            maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
            maven { url "https://maven.aliyun.com/repository/spring-plugin" }
            gradlePluginPortal()
        }
    }
}

buildscript {
    repositories {
        println "aliyun repositories"
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/public' }
    }

    allprojects {
        println "aliyun allprojects ${project.name}"
        repositories {
            maven { url 'https://maven.aliyun.com/repository/google' }
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
        }
    }
}
  • 项目单独配置

插件镜像加速项目根目录/settings.gradle,需放在开头

pluginManagement {
    repositories {
            maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
            maven { url "https://maven.aliyun.com/repository/spring-plugin" }
            gradlePluginPortal()
    }
}
rootProject.name = 'player'

注意点

  • 全局配置和项目级配置的区别
  1. 全局配置是对所有有 Gradle 项目都生效的,但项目级的部分配置可能会覆盖全局的配置
  2. 项目级配置只对本项目生效,如部分项目需要配置 Maven 的私服可单独配置,并跟随git记录和提交
  • Gradle 版本兼容问题
  1. 如果采取了全局配置的方式,可能会有部分版本兼容问题,旧版本的 Gradle 可能不存在部分配置闭包无法识别问题,这是可以将 init.gradle 文件命名为其他名字即可,后续需要再重命名回来。

参考资料