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

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项目都会有效果。不需要每个项目都去配置,并且只影响本地环境,不会对其他机器造成影响。


方法来源于霍老师的视频

http://www.xdnf.cn/news/4971.html

相关文章:

  • LLM 推理加速:深度解析 Prefilling 与 Decoding 阶段的优化秘籍
  • YOLOv1模型架构、损失值、NMS极大值抑制
  • 从设计到开发,原型标注图全流程标准化
  • 学习DLT698进阶二,电表的事件
  • 基于 Ubuntu 24.04 部署 WebDAV
  • window 显示驱动开发-配置内存段类型
  • Jenkins linux安装
  • 【一】浏览器的copy as fetch和copy as bash的区别
  • 解决:EnvironmentNameNotFound: Could not find conda environment?
  • 深入解析Docker底层原理:从Namespace到联合文件系统
  • 使用SVM进行图像分类
  • 每天五分钟深度学习框架pytorch:视觉工具包torchvison
  • 浏览器节能机制导致Websocket断连的坑
  • Python 爬虫基础入门教程(超详细)
  • 代发考试战报:思科华为HCIP HCSE CCNP 考试通过
  • CSS:盒子模型
  • Missashe计网复习笔记(随时更新)
  • C++:求分数序列和
  • 23盘古石决赛
  • docker 镜像的导出和导入(导出完整镜像和导出容器快照)
  • Java 匿名内部类的作用
  • IM系统群消息推送方案
  • 多模型协同预测在风机故障预测的应用(demo)
  • 订阅“科技爱好者周刊”,每周五与你相约科技前沿!
  • Docker下Gogs设置Webhook推送Spug,踩坑记录与解决方案
  • Git clone时出现SSL certificate problem unable to get local issuer certificate
  • 安装docker
  • 【网络编程】四、守护进程实现 前后台作业 会话与进程组
  • ChatTempMail - AI驱动的免费临时邮箱服务
  • 线程中常用的方法