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

    • 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 最贴近开发者的仓库——本地仓库。理解本地仓库的物理结构、GAV 到路径的映射规则,是排查依赖问题、手动清理冗余构件、配置多环境隔离的基础。


核心机制

本地仓库是你本机上的一个副本,既缓存远程下载的构件,也包含你尚未发布的临时构建产物。注意两个关键词——cache(缓存)和 temporary build artifacts(临时构建产物)。本地仓库不仅是"下载来的 JAR 的存放处",也是你运行 mvn install 后,自己项目产出的 JAR 的"临时归宿"。

默认位置与平台差异

Maven 启动时,如果没有显式配置 localRepository,会按以下规则确定本地仓库位置:

操作系统默认路径
WindowsC:\Users\<用户名>\.m2\repository
Linux / macOS~/.m2/repository

这个路径中的 .m2 目录同时存放两个文件:

  • repository/ —— 本地仓库的根目录,所有构件按 GAV 层级存放
  • settings.xml —— 用户的私有配置(如镜像、私服认证、本地仓库路径自定义)

localRepository 配置

如果你希望将本地仓库移到别的位置(如换到更大的磁盘、避免 C 盘空间不足),可以在 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">
    <localRepository>D:/maven-repo</localRepository>
</settings>

注意:settings.xml 有两个层级——

  • 全局配置:$MAVEN_HOME/conf/settings.xml(影响所有用户)
  • 用户配置:~/.m2/settings.xml(仅影响当前用户,优先级更高)

推荐在用户配置中修改 localRepository,避免影响同一台机器上的其他开发者。

仓库目录结构:GAV 到物理路径的映射

本地仓库的目录组织是 Maven 最核心的设计之一。给定一个坐标:

groupId: com.feixiang
artifactId: employee-system
version: 1.0.0
packaging: jar

它在本地仓库中的物理路径为:

~/.m2/repository/
└── com/
    └── feixiang/
        └── employee-system/
            └── 1.0.0/
                ├── employee-system-1.0.0.jar
                ├── employee-system-1.0.0.pom
                ├── employee-system-1.0.0-sources.jar
                ├── employee-system-1.0.0-javadoc.jar
                └── _remote.repositories

映射规则:

坐标元素路径规则示例
groupId点号 . 替换为路径分隔符 /com.feixiang → com/feixiang
artifactId直接作为目录名employee-system → employee-system/
version直接作为目录名1.0.0 → 1.0.0/
构件文件artifactId-version.packagingemployee-system-1.0.0.jar

这个设计保证了全球任何 Maven 项目、任何开发者机器上,同一个 GAV 坐标对应的物理路径完全一致。这是 Maven 实现"可复现构建"的物理基础。

生活类比:图书馆的索书号系统

想象你去国家图书馆借一本书:

  • GAV 坐标 = 索书号:I247.5/1234 这样的编号唯一标识一本书
  • 本地仓库路径 = 书架位置:索书号 I247.5/1234 对应"文学类(I)→ 长篇小说(247.5)→ 第 1234 号书架"。无论谁去借这本书,按索书号找,最终都会走到同一个书架的同一层
  • _remote.repositories:这本书的"借阅记录",记录了这本书是从哪个图书馆(中央仓库、阿里云镜像、还是公司私服)借来的。下次需要更新时,Maven 知道该去问谁

这个类比的关键在于:GAV 不是随意命名的字符串,而是一套严格的地址编码系统。只要坐标确定,路径就确定,工具就能自动定位,无需人工干预。


图示

上图展示了 GAV 坐标到本地仓库物理路径的完整映射过程。这个映射是确定性的——给定相同的 GAV,任何机器、任何时刻生成的路径都相同。这也是 Maven 能在不同开发者之间共享依赖的底层机制。


完整示例

场景

飞翔科技的后端工程师小崔在排查一个诡异的构建问题:项目 pom.xml 里声明了 employee-system 1.0.0,但编译时却报错 package com.feixiang.employee does not exist。架构师白歌怀疑本地仓库里的构件文件损坏,让小崔去本地仓库检查。

操作前:不知道本地仓库在哪

小崔是 Windows 用户,从未关注过本地仓库的位置。他只知道 Maven "自动管理依赖",但不清楚这些 JAR 到底存在哪里、长什么样。

操作步骤

步骤 1:确认本地仓库位置

小崔执行命令查看当前生效的本地仓库路径:

mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout

输出:

C:\Users\xiaocui\.m2\repository

步骤 2:按 GAV 定位构件目录

根据报错信息,缺失的包属于 com.feixiang:employee-system:1.0.0。小崔按 GAV 映射规则找到对应目录:

C:\Users\xiaocui\.m2\repository
└── com
    └── feixiang
        └── employee-system
            └── 1.0.0

步骤 3:检查目录内容

小崔发现 1.0.0/ 目录下只有这些文件:

1.0.0/
├── employee-system-1.0.0.pom          # 只有 2KB,正常
├── employee-system-1.0.0.jar          # 只有 1KB,异常!正常应该 > 50KB
├── employee-system-1.0.0.jar.sha1     # 校验文件
└── _remote.repositories               # 记录来源

employee-system-1.0.0.jar 只有 1KB,明显是一个损坏的下载(可能是上次构建时网络中断导致的)。

步骤 4:清理并重新下载

小崔删除整个 1.0.0/ 目录:

# Windows
rmdir /s /q "C:\Users\xiaocui\.m2\repository\com\feixiang\employee-system\1.0.0"

# Linux/macOS
rm -rf ~/.m2/repository/com/feixiang/employee-system/1.0.0

然后重新执行构建:

mvn compile

操作结果

Maven 重新从阿里云镜像下载 employee-system-1.0.0.jar,这次文件大小为 68KB。编译顺利通过,报错消失。

变化分析:

  • 小崔通过理解 GAV→路径的映射规则,精准定位到问题构件,而不是盲目删除整个本地仓库
  • _remote.repositories 文件让 Maven 知道该去哪个远程源重新下载
  • 这次排查后,小崔在团队内部分享了"按 GAV 查本地仓库"的技巧,前端黄俪和运维李眉也学会了自助解决类似问题

易错点与常见问题

误区一:本地仓库可以随便整个删除

错误认知:"构建出问题了,我把 ~/.m2/repository 整个删掉,让 Maven 重新下载,肯定能好。"

纠正:删除整个本地仓库确实能"重置"状态,但代价极大:

  • 下次构建需要重新下载所有依赖,可能耗时数十分钟
  • 你自己 mvn install 的私有构件也会丢失,其他引用这些构件的项目会报错
  • 某些不稳定的网络环境下,重新下载可能再次失败

正确做法:按 GAV 精准定位问题构件,只删除有问题的版本目录。如本例所示,只删 com/feixiang/employee-system/1.0.0/,保留其他所有已缓存的依赖。

误区二:修改 localRepository 后旧仓库自动迁移

错误认知:"我把 localRepository 从 C 盘改到 D 盘,Maven 会自动把旧仓库里的 JAR 搬过去。"

纠正:Maven 不会自动迁移本地仓库。修改 localRepository 后,新路径是一个空仓库,所有依赖需要重新下载。如果你希望保留旧仓库的内容,必须手动复制 repository/ 目录下的所有文件到新位置,或者使用操作系统的符号链接/目录联接。

误区三:本地仓库里的 .pom 文件没用,可以删

错误认知:"本地仓库里每个版本都有 .jar 和 .pom,.pom 文件那么小,应该是没用的辅助文件,可以删掉省空间。"

纠正:.pom 文件是 Maven 解析传递依赖的关键。它记录了该构件自己依赖了哪些其他构件。如果你删掉 .pom,Maven 就无法知道这个 JAR 还需要哪些传递依赖,构建时会出现 ClassNotFoundException。.pom 文件虽小,却是依赖解析树的"节点描述文件",绝不可删。


小结

本地仓库是 Maven 仓库体系的"第一站",默认位于 ~/.m2/repository。它按严格的 GAV→路径映射规则组织目录,确保全球任何机器上同一坐标对应同一物理位置。通过 settings.xml 中的 localRepository 可以自定义路径,但修改后需手动迁移旧仓库内容。理解本地仓库的物理结构,是精准排查依赖损坏、避免"一刀切"删库重建的必备技能。

本章与全局的关系:本章讲解了"依赖下载后存在哪"。下一章"远程仓库与镜像"将讲解"依赖从哪下载",以及镜像如何拦截和转发仓库请求。

上一页
仓库体系
下一页
远程仓库与镜像