理解Gradle各种仓库

文章目录

简介

对于一个构建工具,仓库配置真的太重要了,Gradle非常灵活,可以处理远程仓库、本地仓库、可以读取本地目录、本地文件,甚至可以读取Maven仓库和ivy仓库(Groovy的Grapes中的Grab就使用的是ivy的仓库模式)。

真是因为Gradle的灵活,导致一个仓库问题也比较复杂,很多时候我们只是能用就没有关心,但是遇到问题可能就只能干瞪眼了。

本文就介绍一下Gradle的仓库体系。

一个容易混淆的问题

很多使用maven的朋友,刚刚接触Gradle的时候最容易混淆的事情就是把GRADLE_USER_HOME当做为maven的localRepository本地仓库一样的东西。

认为只要把GRADLE_USER_HOME设置和maven的localRepository一样,这样就可以和maven公用仓库了,减少网络下载开销,同时避免磁盘空间的浪费。

想法很棒,但是Gradle和Maven的包管理完全不一样。

实际上与Maven本地仓库localRepository对应的是GRADLE_USER_HOME\caches\modules-2\files-2.1

但实际上目录结构的设计也不一样:

个人感觉还是Maven的设计方式更合理一些,Gradle的方式如果哪天想要升级Hash算法,那不完犊子了嘛,虽然也容易解决,但是肯定会是给麻烦。

那有没有什么办法让Gradle使用Maven的库避免重复下载呢?

答案是有的:mavenLocal

mavenLocal

groovy 复制代码
repositories {
    mavenLocal()
}

mavenLocal的意思很简单,就是从Maven的本地仓库查找,如果没有找到就报错。

这样就可以共享Maven的仓库里,不用重复下载和避免磁盘空间浪费。

注意:Gradle官方不推荐使用这种方式,除非你是为了避免项目从Maven迁移到Gradle的兼容风险。

不过,我们自己本地测试,使用这种方式还是很香。

但是,又有新的问题,Gradle怎么找Maven本地仓库呢?

Gradle查找本地仓库

mavenLocal()的查找方式:

  1. 用户配置优先:查找【C:/Users/<用户名>/.m2/settings.xml】 文件中 标签指定的路径
  2. 如果上一步未找到,则查找【M2_HOME/conf/settings.xml】文件中指定的路径,M2_HOME是环境变量,通常配置Maven安装目录
  3. 如果以上两步均未找到有效配置,使用默认路径【C:/Users/<用户名>/.m2/repository、/home/<用户名>/.m2/repository】

我们使用Maven,通常不会使用默认的仓库地址,也基本不会配置环境变量M2_HOME,要怎么使用本地Maven仓库呢?

uri指定本地仓库目录

可以通过uri的方式来指定本地仓库目录:

groovy 复制代码
repositories {
//    mavenCentral()
    maven {
//        url = 'https://maven.aliyun.com/repository/public'
        url = uri("D:\\repository")
    }
}

注意:配置了本地仓库就不会从其他仓库下载了,所以最好再配置一个兜底。

groovy 复制代码
repositories {
    maven {
        url = uri("D:\\repository")
    }
    maven {
        url = 'https://maven.aliyun.com/repository/public'
    }
}

ivy

除了支持maven格式,还支持ivy,Groovy的Grab使用的就是ivy。

groovy 复制代码
repositories {
    ivy {
        url = file("C:\\Users\\trayv\\.groovy\\grapes")
    }
}

我们可以看到ivy的Layout又不一样。

mavenCentral默认远程仓库

groovy 复制代码
repositories {
    // 如果没有配置,默认去远程仓库https://repo.maven.apache.org下载
    mavenCentral()
}

指定远程仓库

groovy 复制代码
repositories {
    maven {
        // 仓库名字,可选
        name = "aliyun-maven"
        url = "https://maven.aliyun.com/repository/public"
        // 高版本gradle必须是https,如果使用的是http地址,增加这个选项,否则出错
        allowInsecureProtocol = true
    }
}

flatDir本地目录

Gradle还可以直接指定文件目录,这个和uri指定目录的区别是:uri指定的是仓库目录,有特定结构,比如遵循Maven的规范。

flatDir从名字就可以看出来,这是一个扁平的目录结构,就是会直接找jar包,不会依赖其他。

这种依赖第三方jar包的时候非常有用,比如买了一个服务,没有源码、没有私服,只有一个jar包,就可以使用flatDir

groovy 复制代码
repositories {
    flatDir {
        dirs 'E:\\ptool\\apache-jmeter-5.6.3\\lib'
    }
}

注意:flatDir的优先级比较低,如果配置了其他仓库,Gradle会优先去其他仓库获取,没有获取到才会使用flatDir

仓库统一管理

老的玩法是定义在build.gradle的allprojects中,新的玩法是定义在settings.gradle(.kts)文件中。

groovy 复制代码
dependencyResolutionManagement {
    repositoriesMode = RepositoriesMode.PREFER_PROJECT
    repositories {
        mavenCentral()
    }
}

repositoriesMode = RepositoriesMode.PREFER_PROJECT的意思是如果项目定义了单独的仓库,优先使用项目中的。

参考

仓库类型

兼容maven

阿里云仓库

相关推荐
SinFeeLoo_星凤楼2 天前
Android Studio 中gradle.properties 中的中文注释显示乱码,如何解决?
android·ide·gradle·android studio·.properties
I'm Jie2 天前
Gradle 多模块依赖集中管理方案,Version Catalogs 详解(Kotlin DSL)
android·java·spring boot·kotlin·gradle·maven
一线大码3 天前
Gradle 基础篇之基础知识的介绍和使用
后端·gradle
雨声不在5 天前
gradle编译missing_rules报错处理
android·gradle·agp8
明川7 天前
Android Gradle - ASM + AsmClassVisitorFactory插桩使用
android·前端·gradle
Coffeeee10 天前
Android15适配之世上本无坑,targetSdkVersion升到35后全是坑
android·前端·gradle
明川12 天前
Android Gradle学习 - Gradle插件开发与发布指南
android·前端·gradle
原来是好奇心14 天前
深入Spring Boot源码(一):环境搭建与初探项目架构
java·gradle·源码·springboot
阿拉斯攀登14 天前
Maven VS Gradle
gradle·maven