当前位置: 首页 > news >正文

Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?

文章目录

    • 前言
    • 解决方案
      • gradle
      • maven 仓库

前言

我们在Android 开发的过程中,经常会遇到三方依赖下载不下来的问题。一般情况下我们会在项目的build.gradle文件中配置多个 maven 仓库来解决。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {repositories {maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }google()mavenCentral()maven { url 'https://jitpack.io' }}
}allprojects {repositories {maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }google()mavenCentral()maven { url 'https://jitpack.io' }}
}task clean(type: Delete) {delete rootProject.buildDir
}

但有时候发现虽然我们配置了其他 maven 仓库,下载的时候还是会提示下载超时。看日志也会发现并没有从我们配置的仓库中下载。

解决方案

如果是在公司,我们可以在公司服务器上搭建自己的 maven 仓库,把项目中maven 仓库地址配置为自己公司的私有仓库,下载依赖包时从公司仓库下载,如果公司仓库没有缓存这个包,就由公司仓库从远程仓库中下载。这样只要下载成功一次,我们就可以一直使用。并且还避免了上游仓库下架该依赖时我们无法使用的问题。
但如果我们是在其他情况下没有办法使用公司仓库应该怎么整?

gradle

当我们想要升级 gradle 版本的时候,会修改项目工程中的 gradle/wrapper/gradle-wrapper.properties文件中的distributionUrl字段的值。这个值就是我们下载gradle的地址,默认地址比如https\://services.gradle.org/distributions/gradle-7.5-all.zip下载的很慢很慢很慢,我们可以修改为国内镜像地址,我使用的是腾讯镜像:distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip。修改完之后,从新sync 以下,享受飞一般的下载速度

maven 仓库

我们可以创建一个init.gradle.kts文件放在gradle的缓存文件夹中,这个文件夹一般是user/xxx/.gradle文件夹,然后在文件中写入如下内容

fun RepositoryHandler.enableMirror() {all {if (this is MavenArtifactRepository) {val originalUrl = this.url.toString().removeSuffix("/")urlMappings[originalUrl]?.let {logger.lifecycle("Repository[$url] is mirrored to $it")this.setUrl(it)}}}
}val urlMappings = mapOf("https://repo.maven.apache.org/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/","https://dl.google.com/dl/android/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/","https://plugins.gradle.org/m2" to "https://mirrors.tencent.com/nexus/repository/gradle-plugins/"
)gradle.allprojects {buildscript {repositories.enableMirror()}repositories.enableMirror()
}gradle.beforeSettings { pluginManagement.repositories.enableMirror()dependencyResolutionManagement.repositories.enableMirror()
}

这里有一点需要注意,Gradle 低于6.8 没有 dependencyResolutionManagement 相关的 API,旧项目有兼容问题。
我们可以把gradle.beforeSettings闭包中相关代码注释掉,应该没啥影响。
当然也可以在 gradle.beforeSettings 中判断一下版本

gradle.beforeSettings {pluginManagement.repositories.enableMirror()// 6.8 及更高版本执行 DependencyResolutionManagement 配置if (gradle.gradleVersion >= "6.8") {val getDrm = settings.javaClass.getDeclaredMethod("getDependencyResolutionManagement")val drm = getDrm.invoke(settings)val getRepos = drm.javaClass.getDeclaredMethod("getRepositories")val repos = getRepos.invoke(drm) as RepositoryHandlerrepos.enableMirror()println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings")} else {println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings")}
}

一般来讲,我们在build.gradle文件中配置的仓库,它们的地址对应的就是上面urlMappings中的key,我们将这些仓库地址全部替换为腾讯镜像就可以了

repositories {mavenCentral()//https://repo.maven.apache.org/maven2google()//https://dl.google.com/dl/android/maven2gradlePluginPortal()//https://plugins.gradle.org/m2
}

这么做的好处是只需要配置这一个文件,在本机上所有的gradle项目都会有效果。不需要每个项目都去配置,并且只影响本地环境,不会对其他机器造成影响。


方法来源于霍老师的视频

相关文章:

  • MATLAB制作柱状图与条图:数据可视化的基础利器
  • [6-1] TIM定时中断 江协科技学习笔记(45个知识点)
  • React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项
  • [计算机科学#13]:算法
  • StreamRL:弹性、可扩展、异构的RLHF架构
  • 数据结构 集合类与复杂度
  • 6.01 Python中打开usb相机并进行显示
  • 【Cesium入门教程】第五课:数据源
  • 敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
  • 在企业级项目中高效使用 Maven-mvnd
  • 量化学习DAY2-开始批量提交alpha!
  • 【Linux】自定义shell的编写
  • 【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径
  • 【Python 元组】
  • 网上商城系统
  • Kafka集群加入新Broker节点会发生什么
  • SQLite 转换为 MySQL 数据库
  • Go语言中 源文件开头的 // +build 注释的用法
  • LeetCode难题解析:数字字符串的平衡排列数目
  • 力扣:轮转数组
  • 云南省安委会办公室:大理州安全生产形势比较严峻,事故总量一直居高不下
  • 工行回应两售出金条发现疑似杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • 重温经典|《南郭先生》:不模仿别人,不重复自己
  • 洞天寻隐·学林纪丨玉洞桃源:仇英青绿山水画中的洞天与身体
  • 中国海警依法驱离日非法进入我钓鱼岛领海船只