Gradle 镜像地址设置

1,499 阅读2分钟

Gradle Wrapper 下载地址镜像

该地址无法在 init.gradle.kts 文件中设置,只能直接在项目中的 gradle-wrapper.properties 文件中直接修改:

# 原地址:
# distributionUrl=https://services.gradle.org/distributions/gradle-8.11.1-bin.zip

# 镜像地址:
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-all.zip

即将 https://services.gradle.org/distributions/ 地址替换为 https://mirrors.cloud.tencent.com/gradle/

需要注意的是,最好将 *-bin.zip 文件改成 *-all.zip 文件,因为有时候可能出现从原地址自动下载 *-source.zip 等其他文件的情况。

全局设置依赖仓库镜像地址

~/.gradle 目录(Windows系统是 C:\Users\用户\.gradle 目录)下创建 init.gradle.kts 文件,添加如下代码:

/**
 * 配置指定的镜像地址,并保留原仓库地址。
 * 适用 Gradle 8.0 及以上版本。
 *
 * 使用方法:在当前脚本中的 mirrorMap 中配置镜像地址。
 *
 */

val current = gradle.gradleVersion.substringBefore(".").toInt()
val isValidGradleVersion = current >= 8

val CENTRAL_URL = "https://repo.maven.apache.org/maven2"
val JCENTER_URL = "https://jcenter.bintray.com"
val GOOGLE_URL = "https://dl.google.com/dl/android/maven2"
val GRADLE_PLUGIN_URL = "https://plugins.gradle.org/m2"

val MIRROR_CENTRAL_URL = "https://maven.aliyun.com/repository/central"
val MIRROR_JCENTER_URL = "https://maven.aliyun.com/repository/jcenter"
val MIRROR_GOOGLE_URL = "https://maven.aliyun.com/repository/google"
val MIRROR_GRADLE_PLUGIN_URL = "https://maven.aliyun.com/repository/gradle-plugin"

val mirrorMap = mapOf(
    CENTRAL_URL to MIRROR_CENTRAL_URL,
    JCENTER_URL to MIRROR_JCENTER_URL,
    GOOGLE_URL to MIRROR_GOOGLE_URL,
    GRADLE_PLUGIN_URL to MIRROR_GRADLE_PLUGIN_URL
)

if(isValidGradleVersion) run {
	msg("可用镜像地址:")
	mirrorMap.forEach {
		msg("* ${it.key} -> ${it.value}")
	}
	
	gradle.settingsEvaluated {
		pluginManagement {
			repositories {
				replaceWithMirrorRepos(logger)
				logger.msg("pluginManagement repositories:")
				//printlnAll(logger)
			}
		}
		dependencyResolutionManagement {
			repositories {
				replaceWithMirrorRepos(logger)
				logger.msg("dependencyResolutionManagement repositories:")
				//printlnAll(logger)
			}
		}
	}
	
	allprojects {
		buildscript {
			repositories {
				replaceWithMirrorRepos(logger)
				logger.msg("[:${project.name}] buildscript repositories:")
				//printlnAll(logger)
			}
		}
		repositories {
			replaceWithMirrorRepos(logger)
			logger.msg("[:${project.name}] repositories:")
			//printlnAll(logger)
		}
	}
}


fun String.normalizeUrl(): String = this.trimEnd('/')


fun RepositoryHandler.replaceWithMirrorRepos(logger: Logger) {
     val mavenRepos = this.toList()
         .filterIsInstance<MavenArtifactRepository>()
         .associateWith { it.url.toString().normalizeUrl() }

     val applyRepos = mavenRepos.filter { (_, url) ->
         mirrorMap.containsKey(url) && !mavenRepos.containsValue(mirrorMap[url])
     }

     applyRepos.forEach { (repo, url) ->
         val mirrorUrl = mirrorMap[url]!!
         val nrp = maven { setUrl(uri(mirrorUrl)) }
         remove(nrp)
         val index = indexOf(repo)
         add(index, nrp)
         remove(repo)
         logger.msg("添加镜像(${index}): $url -> $mirrorUrl")
     }
     applyRepos.keys.forEach { repo ->
         addLast(repo)
     }
}

fun Logger.msg(message: String) {
    lifecycle("[configMirrorRepositories.init.gradle.kts] $message")
}

fun msg(message: String) {
	println("[configCustomRepositories.init.gradle.kts] $message")
}

fun RepositoryHandler.printlnAll(logger: Logger) {
	filterIsInstance<MavenArtifactRepository>().forEach { repo ->
		logger.msg("* [${repo.name}](${repo.url})")
	}
}

data class Repo(
    val name: String,
    val url: String? = null,
    val username: String? = null,
    val password: String? = null
)

该代码的作用是检查 settings.gradle.ktsbuild.gradle.kts 文件中的 repositories 配置,如果存在指定仓库地址且没有配置对应的镜像地址,则将对应的镜像地址替换至原地址的位置(保留查询顺序),并将原地址移至配置列表末端(保留原地址,避免镜像地址没有同步最新数据)。

这应该已经是目前最优的设置镜像仓库的方法,唯一遗憾的是,只能设置镜像仓库的 url,没办法将原仓库的其他配置(如content)复制到镜像仓库的配置中。


  • 2026年2月14日更新:适配 Gradle 9.0,兼容 Gradle 6、Gradle 7(不执行逻辑,也不报错)。