理解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

阿里云仓库

相关推荐
小当家.1054 天前
Maven与Gradle完整对比指南:构建工具深度解析
java·gradle·maven
indexsunny4 天前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景的应用解析
java·spring boot·redis·微服务·kafka·gradle·maven
zhanglb126 天前
Gradle 全局配置使用
gradle·android studio·intellij idea
Jennifer33K6 天前
AndroidStudio报错:minSdk(APl 33)> deviceSdk(APl 30)
android·gradle·android studio
fundroid12 天前
使用 Gradle Convention Plugins(约定插件)优化 Android 编译配置
android·gradle·约定插件
trayvontang20 天前
Gradle核心概念与快速上手
gradle·项目构建·依赖分析·jdk自动下载
SinFeeLoo_星凤楼22 天前
Android Studio 中gradle.properties 中的中文注释显示乱码,如何解决?
android·ide·gradle·android studio·.properties
I'm Jie23 天前
Gradle 多模块依赖集中管理方案,Version Catalogs 详解(Kotlin DSL)
android·java·spring boot·kotlin·gradle·maven