Gradle 设置全局镜像源
复制 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle
或者 Linux 的 ~/.gradle
目录下。也可以直接复制文末的代码为 init.gradle.kts
。
Gradle 不支持镜像源的直接设置,只能通过 maven() 方法设置一个新的 Maven 仓库地址。
在 init.gradle 中调用 maven() 会导致镜像仓库排在上游仓库之后,会导致Gradle 优先使用上游仓库。如果直接删除上游仓库又会出现新的问题。Maven 镜像源和上游仓库并不是完全实时同步的,可能会缺失某些文件,特别是一些刚发布的包。所以上游仓库必须保留并且需要排在镜像仓库之后。
在使用过程中发现阿里云的 Maven 镜像源仍然会出现找不到文件的错误。排查之后发现阿里云镜像源的某个包竟然只有 POM 文件而没有 JAR 文件。在这种情况下 Gradle 找到了 POM 文件就会仅使用阿里云镜像源,然后找不到 JAR 文件报错,而不会继续使用上游仓库。查阅 Gradle 文档之后,发现有个 artifactUrls() 方法可以设置 Maven 仓库的除 POM 文件之外的其他文件下载地址。这样就可以通过在镜像仓库中将上游仓库地址设置为Artifact URL解决这个问题。
普通的 Java 或 Kotlin 项目默认是在 build.gradle 里设置 Maven 仓库地址,所以在 init.gradle 里需要在 allprojects
代码块中设置镜像源。而 Android 项目默认都是在 settings.gradle 的 pluginManagement
和 dependencyResolutionManagement
代码块中设置 Maven 仓库地址。仅在 allprojects
中设置镜像源没有用。所以还需要在 settingsEvaluated
代码块中进行设置。
一些旧的项目在添加 Google Maven 仓库时,直接使用 maven("https://maven.google.com") 而不使用 google() 方法。构建项目时会一直卡在 Building 的状态,并且没有任何提示。maven.google.com
这个域名在国内是 ping 不通的。而如果使用 google() 方法,Gradle 会使用 https://dl.google.com/dl/android/maven2,这个链接在国内可以直连。所以需要将上游 Google 仓库的 "https://maven.google.com" 替换为 "https://dl.google.com/dl/android/maven2"。
解决一系列问题之后,最终的 init.gradle 完成了。Gradle 同时支持 Groovy DSL(.gradle) 和 Kotlin DSL(.gradle.kts)。我选择后者编写 init.gradle.kts。由于 Gradle 直接两种 DSL 语言的混用,所以如果之后构建 Groovy DSL 形式的 Gradle 项目,也不需要额外再编写 init.gradle。
// https://gist.github.com/mkckr0/97ec5b0d99feede4c19ee6f905d5e722
val repoMirrorMap = mapOf(
"https://repo.maven.apache.org/maven2" to "https://maven.aliyun.com/repository/central",
"https://dl.google.com/dl/android/maven2" to "https://maven.aliyun.com/repository/google",
"https://plugins.gradle.org/m2" to "https://maven.aliyun.com/repository/gradle-plugin",
"https://jcenter.bintray.com" to "https://maven.aliyun.com/repository/jcenter",
)
val repoReplaceMap = mapOf(
"https://maven.google.com" to "https://dl.google.com/dl/android/maven2"
)
fun RepositoryHandler.setMirrors() {
all {
if (this is MavenArtifactRepository && !name.endsWith("Origin")) {
val originName = name
var originUrl = url.toString().trimEnd('/')
// do replace
repoReplaceMap[originUrl]?.let { newUrl ->
originUrl = newUrl
setUrl(originUrl)
}
// do mirror
repoMirrorMap[originUrl]?.let { newUrl ->
// replace into mirror repo
setUrl(newUrl)
// add origin repo to find missing jars
artifactUrls(originUrl)
// keep origin repo to find missing POM
maven(originUrl) { name = "$originName Origin" }
}
}
}
printRepos()
}
fun RepositoryHandler.printRepos() {
all {
if (this is MavenArtifactRepository) {
println("Maven Repo: name=\"$name\", url=$url, artifacts=${artifactUrls}")
}
}
}
settingsEvaluated {
pluginManagement {
repositories {
setMirrors()
}
}
dependencyResolutionManagement {
@Suppress("UnstableApiUsage")
repositories {
setMirrors()
}
}
}
allprojects {
buildscript {
repositories {
setMirrors()
}
}
repositories {
setMirrors()
}
}
Gradle 设置全局镜像源的更多相关文章
- CentOS8设置国内镜像源(阿里云镜像)
CentOS8设置国内镜像源(阿里云) 1.备份原有配置 [root@localhost ~]# mkdir /etc/yum.repos.d.bak [root@localhost ~]# mv / ...
- Maven、Gradle 配置国内镜像源
Maven 全局配置 修改 Maven 默认的全局配置文件: 类 Unix 系统: Mac OS / Linux 默认在 ~/.m2/settings.xml Windows 系统:一般在 Maven ...
- CentOS7 设置软件镜像源
Linux拥有众多的发行版,每个发行版都有提供镜像,但是,在国内这些镜像的下载速度参差不齐,偶尔会有更新失败的情况. 网上众多推荐的镜像源为163的镜像,笔者通过一段时间的试用,发现某些小众带宽访问1 ...
- 设置pip镜像源
修改镜像源 vim ~/.pip/pip.conf windows 当前用户目录\pip\pip.ini 内容 [global] index-url=https://pypi.tuna.tsinghu ...
- Gradle 设置全局代理
#systemProp.socks.proxyHost=127.0.0.1 #systemProp.socks.proxyPort=7077 #systemProp.https.proxyHost=1 ...
- Docker 设置国内镜像源
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 # vi /etc/docker/daemon.json { "registry- ...
- docker镜像源设置
由于docker默认镜像源为国外官方源,下载速度较慢.设置国内镜像源可加速 修改文件 /etc/docker/daemon.json vi /etc/docker/daemon.json 添加以下内容 ...
- 使用镜像源安装EASY_INSTALL和PIP教程
使用easy_install和pip可以让python的模块的安装和管理变得非常方便.我一般在新的Linux系统上,先easy_install pip然后就用pip安装其他的模块了. 不过,在国内用官 ...
- [Linux] - Manjaro ARM 系统配置(更新镜像源,安装 Docker 和 Dotnet Core)
硬件:Raspberry Pi 4B系统:Manjaro-ARM-xfce-rpi4-19.08网址:https://manjaro.org/ Issue系统启动后,中文字符显示为小方格乱码 解决:安 ...
- gradle 国内加速,修改镜像源
为什么慢 由于默认情况下执行 gradle 各种命令是去国外的 gradle 官方镜像源获取需要安装的具体软件信息,所以在不使用代理.不翻墙的情况下,从国内访问国外服务器的速度相对比较慢 如何修改镜像 ...
随机推荐
- Access+Trunk 配置
实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 在SW1和SW2上创建聚合组 PC1 与 PC3 属于 VLAN 10 : PC2 与 PC4 属于 VLAN 20 利用 Access 与 T ...
- rust cargo build一直出现 Blocking waiting for file lock on package cache
如果确定没有多个程序占用,可以删除rm -rf ~/.cargo/.package-cache,然后再执行
- Git使用教程(带你玩转GitHub)
Git使用教程(理论实体结合体系版) 下载安装: 按照这个博客来就好 Windows系统Git安装教程(详解Git安装过程) - 学为所用 - 博客园 (cnblogs.com) Git命令大全: G ...
- springboot使用Websocket写一个聊天室
1 <!--websocket 依赖--> 2 <dependency> 3 <groupId>org.springframework.boot</group ...
- 从零开始整SpringBoot-工具与插件
工具 工具 名称 地址 IDEA https://www.jetbrains.com/idea/ JDK1.8 https://www.oracle.com/java/technologies/jav ...
- 2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负。 爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,
2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = ...
- 快速上手 | Datavines 两表值比对规则用法
Datavines 是一站式开源数据可观测性平台,提供元数据管理.数据概览报告.数据质量管理,数据分布查询.数据趋势洞察等核心能力,致力于帮助用户全面地了解和掌管数据,让您做到心中有数. 场景 比较某 ...
- 使用docker构建可动态启动的FreeSWITCH实例
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6 使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的 ...
- 从逻辑门到 CPU
目的,造一个很简单的,概念上的 CPU,虽然简单,但是是五脏俱全的 CPU 从最基础的逻辑门开始造,零基础可以看 制造基本武器:与门.非门.或门 现在计算机都是二进制,那二进制是一开始就能想到的吗?显 ...
- DolphinScheduler3.1.7集成SAP HANA
源码地址:GitHub - apache/dolphinscheduler at 3.1.7-release 个人fork gitee地址:DolphinScheduler:Gitee) 后端代码更改 ...