乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 介绍与核心概念

    • Maven是什么
    • 约定优于配置
  • 第2章 安装与配置

    • 安装与验证
    • settings.xml
    • 本地仓库与镜像
  • 第3章 POM与项目坐标

    • POM
    • GAV坐标
    • packaging
  • 第4章 标准目录布局

    • 标准目录布局
  • 第5章 依赖机制

    • dependencies
    • scope
    • 依赖传递
    • 依赖冲突与调解
    • exclusions
    • optional
    • dependencyManagement
  • 第6章 仓库

    • 仓库体系
    • 本地仓库
    • 远程仓库与镜像
    • 私服
  • 第7章 构建生命周期

    • 生命周期概述
    • clean 生命周期
    • default 生命周期
    • site 生命周期
    • 生命周期与插件绑定
  • 第8章 插件

    • 插件概述
    • maven-compiler-plugin
    • maven-surefire-plugin
    • maven-war-plugin
  • 第9章 继承与聚合

    • parent继承
    • 聚合
    • BOM
    • properties
  • 第10章 属性与资源过滤

    • 资源过滤
    • Profile
  • 第11章 常用命令

    • mvn compile
    • mvn test
    • mvn package
    • mvn clean
    • mvn install
    • mvn dependency:tree
  • 第12章 常见问题与最佳实践

    • 依赖冲突排查
    • 最佳实践

仓库体系

本章是"仓库"主题的起点。理解仓库在 Maven 依赖管理中的核心地位,是后续学习本地仓库配置、远程仓库镜像、企业私服部署的前提。仓库体系是 Maven 自动下载依赖的"物流网络",没有它,坐标(GAV)只是一串无法落地的符号。


核心机制

仓库是用来存放构建产物和各类依赖的地方。将仓库分为两大类:

  • 本地仓库(Local Repository):开发者机器上的私有仓库
  • 远程仓库(Remote Repository):网络上共享的仓库,包括中央仓库(Central Repository)和私服(Internal Repository)

需要特别注意的是,仓库不仅存依赖(你下载的第三方 JAR),也存构建产物(你自己项目打出来的 JAR)。这意味着本地仓库里既有 spring-context-5.3.21.jar,也可能有 com/feixiang/employee-system/1.0.0/employee-system-1.0.0.jar。

仓库在 Maven 中的三重核心作用

作用说明类比
依赖解析与下载根据 pom.xml 中的 GAV 坐标,自动定位并下载 JAR 包快递系统根据地址单自动取货
构建产物存储将 mvn install 生成的 JAR 安装到本地仓库,供其他项目引用工厂成品入库,供下游车间领用
缓存与加速下载过的依赖存入本地仓库,避免重复下载;镜像和私服提供网络级缓存个人书架 + 社区图书馆 + 国家档案馆

仓库类型概览

Maven 的仓库体系由四个层次构成,形成一条从"个人桌面"到"全球互联网"的完整链路:

  1. 本地仓库(Local Repository)

    • 位置:开发者本机,默认 ~/.m2/repository
    • 作用:缓存所有下载过的依赖,存储 mvn install 的产物
    • 特点:私有、离线可用、按 GAV 目录结构组织
  2. 镜像(Mirror)

    • 本质:远程仓库的"替身"或"代理"
    • 作用:拦截对某个远程仓库的请求,转发到另一个地址(如阿里云镜像拦截中央仓库请求)
    • 特点:不存储新内容,只转发和缓存
  3. 中央仓库(Central Repository)

    • 运营者:Maven 社区 + Sonatype
    • 地址:https://repo.maven.apache.org/maven2
    • 作用:全球最大的开源 Java 构件仓库,托管数百万开源项目
    • 特点:只读、全球访问、无需配置即可使用
  4. 私服(Internal Repository)

    • 代表产品:Nexus、Artifactory
    • 作用:企业内部的仓库中心,代理外部仓库 + 托管私有构件
    • 特点:可控、安全、可缓存加速、支持权限管理

生活类比:图书借阅系统

想象你要写一本关于 Java 后端架构的书(构建一个项目),需要参考大量资料(依赖):

  • 本地仓库 = 你的个人书架:你以前买过的书、借过的书都摆在上面。下次需要同一本书,直接从书架上拿,不用再去图书馆。
  • 镜像 = 社区分馆/复印站:市图书馆(中央仓库)太远,社区分馆(阿里云镜像)有同样的藏书,而且更近、借书更快。分馆本身不出版新书,只是帮市图书馆做"就近分发"。
  • 中央仓库 = 国家图书馆:收藏了全国所有公开出版的书籍(开源 JAR)。如果你书架上没有,社区分馆也没有,最终要去这里找。
  • 私服 = 大学/企业内部图书馆:收藏了国家图书馆的书(代理),也收藏了内部保密资料(私有 JAR,如公司核心算法包)。只有本校师生/公司员工能进,外人借不了。

这个类比的关键在于:Maven 的依赖解析是一条有优先级的查找链——先查书架,再查分馆,最后查国家图书馆。而大学内部图书馆则是特定人群(企业员工)的专属通道。


图示

上图展示了 Maven 仓库体系的全景链路。当项目声明一个依赖时,Maven 按以下优先级查找:

  1. 本地仓库:如果之前下载过,直接返回,速度最快
  2. 镜像/私服:如果配置了镜像或私服,请求被拦截到这些节点
  3. 中央仓库/其他公共仓库:最终兜底,从互联网下载

下载成功的构件会被反向缓存到本地仓库(以及私服,如果配置了),下次再用时无需联网。这个设计让 Maven 在首次下载后可以实现离线构建。


完整示例

场景

飞翔科技的 employee-system 项目需要引入 Spring Boot 和 MySQL 驱动。后端工程师小崔第一次在新电脑上构建项目,CTO 大翔要求所有人统一使用公司配置的阿里云镜像加速下载。

操作前:仓库体系尚未运转

小崔的电脑是全新的,本地仓库 ~/.m2/repository 几乎是空的。employee-system 的 pom.xml 声明了以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.12</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>

settings.xml 中已配置阿里云镜像(由架构师白歌统一分发):

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
</settings>

操作步骤

小崔执行构建命令:

mvn compile

操作结果

Maven 控制台输出(节选):

[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< com.feixiang:employee-system >------------------
[INFO] Building employee-system 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] Downloading from aliyunmaven: https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starter-web/2.7.12/spring-boot-starter-web-2.7.12.pom
[INFO] Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starter-web/2.7.12/spring-boot-starter-web-2.7.12.pom (3.2 kB at 12 kB/s)
[INFO] Downloading from aliyunmaven: https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starters/2.7.12/spring-boot-starters-2.7.12.pom
...
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ employee-system ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 15 source files to /home/xiaocui/employee-system/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

变化分析

  1. 请求被镜像拦截:日志中所有下载地址都是 maven.aliyun.com,而非 repo.maven.apache.org,说明阿里云镜像生效
  2. 依赖被缓存到本地仓库:构建完成后,小崔的 ~/.m2/repository 下新增了数百个目录,包括 org/springframework/boot/spring-boot-starter-web/2.7.12/
  3. 传递依赖自动下载:spring-boot-starter-web 本身依赖了 spring-boot-starter、spring-webmvc 等几十个构件,Maven 自动递归下载并缓存
  4. 第二次构建无需联网:小崔再次执行 mvn compile,日志中不再有 Downloading 字样,全部从本地仓库读取

易错点与常见问题

误区一:仓库只是"存 JAR 的地方"

错误认知:"仓库不就是放 JAR 包的文件夹吗?跟我自己建个 lib/ 目录有什么区别?"

纠正:仓库的核心价值不是"存储",而是按 GAV 坐标组织的可寻址存储。lib/ 目录里的 spring-context-5.3.21.jar 只是一串二进制数据;仓库里的 org/springframework/spring-context/5.3.21/spring-context-5.3.21.jar 则是一个可被坐标唯一标识、可被工具自动解析、可被传递依赖引用的标准化构件。没有坐标系统,仓库就退化为普通的文件堆。

误区二:中央仓库包含所有 Java 开源项目

错误认知:"只要是个开源 Java 项目,中央仓库里一定有。"

纠正:中央仓库只包含主动提交并审核通过的构件。很多开源项目(如某些公司内部的 SDK、早期版本的实验性项目)并未发布到中央仓库。此外,Spring 生态的部分构件托管在 repo.spring.io,JBoss 的构件托管在 repository.jboss.org。如果 pom.xml 中声明了这些仓库,Maven 会自动去对应地址查找;如果没有声明,构建就会报 Could not find artifact 错误。

误区三:配置了镜像就不需要本地仓库

错误认知:"我配置了阿里云镜像,所有依赖都从阿里云实时下载,本地仓库没什么用了。"

纠正:镜像和本地仓库是互补关系,不是替代关系。镜像解决的是"从哪下载"(网络来源),本地仓库解决的是"下载后存哪"(本地缓存)。即使配置了镜像,下载回来的 JAR 仍然要存入本地仓库,否则每次构建都要重新下载,既慢又不稳定。本地仓库还让离线构建成为可能——出差没网时,只要本地仓库完整,项目照样能编译。


小结

仓库体系是 Maven 依赖管理的物理基础设施,由本地仓库、镜像、中央仓库、私服四个层次构成。它们通过 GAV 坐标系统串联,形成一条"先本地、后镜像/私服、最后中央仓库"的优先级查找链。理解这个体系的全景,是配置 settings.xml、排查依赖下载失败、设计企业级 Maven 架构的基础。

本章与全局的关系:本章描绘了仓库体系的"地图"。接下来四章将按图索骥,分别深入本地仓库的物理结构、远程仓库与镜像的配置原理、私服的企业级部署,让你从"知道有仓库"进化为"能驾驭仓库"。

下一页
本地仓库