无法同步gradle(Could not install Gradle distribution from...)?请看……

0 阅读2分钟

Gradle

另外一个常用的 Java 项目管理工具就是 Gradle,比如笔者常用的 Android Studio 就是使用 Gradle 作为 APK 的编译工具。

更准确地说是使用 gradle 的封装脚本 gradlew,其中包含了具体的 gradle 版本,避免不同版本之间的编译脚本兼容性问题。作为国内用户,经常就死在了 gradlew 的第一步,因为其会去下载对应版本的 grandle-bin,比如 https://services.gradle.org/distributions/gradle-8.0-bin.zip 。

解决方法是修改 gradle/wrapper/gradle-wrapper.properties 文件指定 distributionUrl 为国内镜像源的具体地址,例如:

prop

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://mirror.nju.edu.cn/gradle/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

其他的 gralde distribution 镜像地址可以参考:

解决完 gradle-bin 的下载问题后,还会遇到与 maven 类似的中央仓库下载网络问题,但是 gradle 没有类似 maven 的 mirror tag,而只有类似的 repositories tag,用指定私有仓库的方式将其指定到国内的 maven 仓库镜像中。

使用 Groovy DSL 的 gradle 配置文件 build.gradle 可以添加以下配置:

groovy

allprojects {
    repositories {
		maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/public' }
        mavenLocal()
        mavenCentral()
    }
}

使用 Kotlin 的 gradle 配置文件 build.gradle.kts 可以使用下述配置:

kotlin

repositories {
    maven { setUrl("https://maven.aliyun.com/repository/google/") }
    maven { setUrl("https://maven.aliyun.com/repository/public/") }
    mavenLocal()
    mavenCentral()
}

Gradle 似乎没有全局的配置方案,网上的教程更多是使用 init.gradle 即初始化脚本,在项目的 gradle 脚本任务执行之前替换掉 repo 地址:

groovy

allprojects{
  repositories {
    all { ArtifactRepository repo ->
      if(repo instanceof MavenArtifactRepository){
        def url = repo.url.toString()
        if (url.startsWith('https://repo1.maven.org/maven2')) {
          project.logger.lifecycle "remove ${repo.url}"
          remove repo
        }
        if (url.startsWith('https://jcenter.bintray.com/')) {
          project.logger.lifecycle "remove ${repo.url}"
          remove repo
        }
      }
    }
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
  }
}

这种方式着实不太优雅,但也能算是一种不修改原始代码工程文件的镜像方案。

值得一提的是,云厂商的 maven 仓库镜像也只有一部分 repository,像 jitpack.io 这类仓库可能镜像中就无法找到,此时只能另觅他法了。

说句题外话,不管是 maven 还是 gradle,其实本质上都是一个 Java 工具,因此我们可以通过给 Java 应用添加属性的方式设置代理。比如 maven/gradle 可以通过 -D 添加属性;gradle 可以通过在 gradle.properties 中添加属性 (需要添加前缀,如: systemProp.https.proxyHost)。其中 gradle.properties 除了放在项目根目录中,还可以全局使用,在 NIX 系统中路径是 $HOME/.gradle/gradle.properties,Windows 中则是 %userprofile%.gradle\gradle.properties

参考:

-【文章】evilpan.com/2024/02/13/…