程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 依赖管理 - Maven

    • Maven 安装配置
    • Maven 仓库解析
      • 什么是 Maven 仓库?
      • Maven 寻找依赖的顺序
      • Maven 仓库结构
      • Maven 坐标
      • 本地仓库配置
      • 远程仓库配置
      • 镜像仓库配置
      • POM 中配置远程仓库
        • 1. repositories 标签
        • 2. pluginRepositories 标签
        • 3. 配置一个中央仓库的中国镜像
      • 远程仓库配置的注意事项
      • 配置Maven 仓库按顺序加载
        • 1. 在 pom.xml 中配置仓库顺序
        • 2. 在 settings.xml 中配置全局仓库顺序
    • Maven 项目构建
    • Maven 依赖管理
    • 手动安装Maven依赖
    • Maven 聚合
    • Maven 继承
    • Maven 属性
    • Maven 版本与测试
    • Maven 资源与多环境配置
    • Maven 生命周期与插件
    • 本地搭建Maven私服
    • Docker搭建Maven私服
    • Maven 上传中央仓库
    • Maven 依赖排除插件
  • 开发管理 - Git

  • Git小乌龟教程

  • 代码管理
  • 依赖管理 - Maven
scholar
2024-08-20
目录

Maven 仓库解析

# Maven 仓库解析

  • 什么是 Maven 仓库?
  • Maven 寻找依赖的顺序
  • Maven 仓库结构
  • Maven 坐标
  • 本地仓库配置
  • 远程仓库配置
  • 镜像仓库配置
  • POM 中配置远程仓库
    • 1. repositories 标签
    • 2. pluginRepositories 标签
    • 3. 配置一个中央仓库的中国镜像
  • 远程仓库配置的注意事项
  • 配置Maven 仓库按顺序加载
    • 1. 在 pom.xml 中配置仓库顺序
    • 2. 在 settings.xml 中配置全局仓库顺序

Maven 仓库是管理和存储构件(如 JAR、WAR、POM 文件等)的地方,Maven 项目通过仓库获取所需的依赖项。Maven 仓库分为本地仓库、中央仓库和远程仓库。合理配置 Maven 仓库能够提高构建效率并减少重复依赖的下载。

# 什么是 Maven 仓库?

Maven 仓库是存放所有构件的地方,Maven 项目可以从这些仓库中获取自己所需的依赖。Maven 仓库分为以下几种类型:

  1. 本地仓库:存储在本地机器上,Maven 默认会首先在本地仓库中寻找依赖。
  2. 中央仓库:Maven 官方提供的默认远程仓库,所有 Maven 项目默认都会从这里下载依赖。
  3. 远程仓库:用户可以配置自定义的远程仓库,如公司内部的私有仓库或镜像仓库。

# Maven 寻找依赖的顺序

1. 本地仓库优先

无论仓库是定义在 pom.xml 还是 settings.xml 中,Maven 总是首先在本地仓库(通常位于 ~/.m2/repository)中查找依赖。如果本地仓库中已经有需要的依赖,那么 Maven 不会访问远程仓库。

2. pom.xml 和 settings.xml 中的仓库

  • pom.xml 中的仓库:在解析依赖时,Maven 会按照 pom.xml 中定义的仓库顺序依次查找。这些仓库的定义是项目级别的,优先级较高。
  • settings.xml 中的仓库:settings.xml 中<profiles> 内定义的仓库配置通常是全局级别的,会在 pom.xml 中的仓库之后进行查找。如果一个仓库仅在 settings.xml 中定义,而不在 pom.xml 中定义,那么在 pom.xml 中没有找到依赖的情况下,Maven 会继续到 settings.xml 中定义的仓库查找。

3. 镜像配置(Mirrors)

  • 如果在 settings.xml 中配置了镜像(<mirrors> 元素),这个镜像会覆盖 pom.xml 中的所有远程仓库请求。无论是 pom.xml 中定义的仓库还是中央仓库,都会优先被重定向到镜像仓库。

4. 中央仓库

  • 如果在 pom.xml 和 settings.xml 中都没有找到依赖,且没有被镜像覆盖,Maven 最后会查找中央仓库(https://repo.maven.apache.org/maven2)。

5. 实际顺序

  • 本地仓库 > pom.xml 中的仓库 > settings.xml 中的仓库(通常通过 <profiles> 定义) > 中央仓库

# Maven 仓库结构

Maven 仓库

仓库类型:

  1. 本地仓库:开发者本机上的仓库,存储从远程仓库下载的依赖。首次运行 Maven 时,Maven 会自动创建本地仓库,默认位置为:C:\Users\用户名\.m2\repository。

  2. 远程仓库:

    • 中央仓库:由 Maven 官方维护的公共仓库,默认情况下 Maven 会从这里下载依赖。
    • 私服:公司或部门内部的私有仓库,通常用于存放自有或私密的依赖资源。

    私服的作用:

    • 存储有版权的资源,如购买或自研的 JAR 包。
    • 中央仓库中的资源大多为开源资源,私服可以存储私有资源。
    • 在组织内部共享资源,提高依赖获取的效率。

# Maven 坐标

Maven 使用坐标来唯一标识和定位仓库中的资源。坐标类似于资源的“地址”,通过唯一标识定位到具体的依赖。

坐标组成:

  • groupId:组织名称(通常为域名的反写)。
  • artifactId:项目名称或模块名称。
  • version:版本号。
  • packaging:打包类型(如 jar、war)。

坐标的作用:坐标提供了资源的唯一标识,帮助 Maven 自动解析和下载依赖。

# 本地仓库配置

Maven 默认的本地仓库地址为 ${user.home}/.m2/repository,你可以在 Maven 的 settings.xml 文件中自定义本地仓库的位置:

配置自定义本地仓库路径:

<settings>
  <!-- 自定义本地仓库路径 -->
  <localRepository>D:/.m2/repository</localRepository>
</settings>
1
2
3
4

本地仓库配置

建议:自定义仓库路径最好选择一个磁盘空间较大的位置,因为随着项目规模的增长,下载的依赖包数量会逐渐增多,占用大量磁盘空间。

# 远程仓库配置

Maven 默认从中央仓库下载依赖,配置如下:

<repositories>
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
1
2
3
4
5
6
7
8
9
10
11

配置解析:

  • <id>:仓库的唯一标识,用于在项目中引用。
  • <url>:远程仓库的访问地址。
  • <releases> 和 <snapshots>:配置是否允许下载发布版本(releases)和快照版本(snapshots)。

# 镜像仓库配置

为了加快下载速度,可以配置国内的镜像仓库,如阿里云的 Maven 仓库。镜像仓库的作用是替代默认的中央仓库,加快依赖下载速度。

提示

阿里云镜像仓库地址:https://developer.aliyun.com/mvn/guide (opens new window)

配置镜像仓库:

在 settings.xml 文件中的 <mirrors> 标签中添加如下内容:

<mirrors>
    <mirror>
        <!-- 必须:唯一标识符,用于区分不同的镜像 -->
        <id>nexus-aliyun</id>
        <!-- 必须:指定要替代的远程仓库 -->
        <mirrorOf>central</mirrorOf>
        <!-- 可选:镜像名称,主要用于描述 -->
        <name>Nexus aliyun</name>
        <!-- 必须:镜像的 URL 地址 -->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        <!-- 可选:仓库布局,通常为默认值 default -->
        <layout>default</layout>
    </mirror>
</mirrors>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

镜像仓库配置

详细说明:

  1. <id> (必须):用于标识镜像的唯一 ID,可以任意定义,但建议使用有意义的名称,如 nexus-aliyun。

  2. <mirrorOf> (必须):指定该镜像替代的仓库。常见值为:

    • central:替代 Maven 官方中央仓库。
    • *:替代所有仓库。
    • external:*:替代所有非本地仓库。
  3. <name> (可选):镜像的名称,仅用于描述,实际配置中可省略。

  4. <url> (必须):镜像的 URL 地址,Maven 下载依赖时会访问此地址。

  5. <layout> (可选):仓库布局,通常为 default。在大部分情况下保留默认值即可。

配置效果:

配置完成后,Maven 将从国内的阿里云镜像仓库下载依赖,而不是从国外的中央仓库,速度会大幅提升。

# POM 中配置远程仓库

Maven 默认通过超级 POM 配置了 ID 为 central 的远程仓库,但在实际项目中,我们通常需要自定义其他远程仓库,例如使用局域网内的私有仓库或特定的公共仓库。

  1. 局域网的私有仓库:利用本地网络中的私有仓库,加速依赖下载,提升构建效率。
  2. 特定公共仓库:某些依赖项在中央仓库中无法找到,只能从指定的公共仓库中获取。

应用场景

如果有些 jar 包在 Maven 中央仓库没有,但是在其他仓库(例如:阿里仓库、spring 仓库、mybatis 仓库)里是有这个 jar 包的,例如spring 新发布了一个版本,由于是刚发行的版本,性能不太稳定,这个时候 Maven 中央仓库一般不会将这些 jar 包录入,但是你就是想用 spring 最新的版本,那么可以在 pom.xml 中通过配置 repositories 从指定的某公司官方仓库来获取相应的 jar 包。

# 1. repositories 标签

  • 作用:用于指定项目依赖(如 JAR 包)下载来源。
  • 适用场景:配置项目构建所需的第三方依赖库来源。

例如,项目中需要下载特定版本的第三方库(如 MySQL 驱动),Maven 会首先从配置的仓库中查找该依赖。

<repositories>
    <repository>
        <id>maven-repo</id>
        <url>https://example.com/maven-repo</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
1
2
3
4
5
6
7
8
9
10
11
12

# 2. pluginRepositories 标签

  • 作用:用于指定 Maven 插件(如编译插件、打包插件)下载来源。
  • 适用场景:配置项目构建过程中所需的 Maven 插件库来源。

例如,Maven 项目需要下载编译插件(maven-compiler-plugin)或打包插件(maven-assembly-plugin),Maven 会从配置的仓库中下载所需插件。

<pluginRepositories>
    <pluginRepository>
        <id>plugin-repo</id>
        <url>https://example.com/plugin-repo</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>
1
2
3
4
5
6
7
8
9
10
11
12
  • 用途不同:<repositories> 用于指定项目依赖库的下载来源,而 <pluginRepositories> 用于指定构建插件的下载来源。
  • 应用场景不同:<repositories> 解决项目构建所需的第三方依赖,而 <pluginRepositories> 解决构建过程中所需的 Maven 插件。

# 3. 配置一个中央仓库的中国镜像

以下配置示例展示了如何在 pom.xml 中添加一个指向中央仓库中国镜像的远程仓库:



 














 
















<project>
  ...
  <!-- 配置依赖库的远程仓库 -->
  <repositories>
    <repository>
      <id>maven-net-cn</id>
      <name>Maven China Mirror</name>
      <url>http://maven.net.cn/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
  
  <!-- 配置插件库的远程仓库 -->
  <pluginRepositories>
    <pluginRepository>
      <id>maven-net-cn</id>
      <name>Maven China Mirror</name>
      <url>http://maven.net.cn/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>    
    </pluginRepository>
  </pluginRepositories>
  ...
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

在以上配置中,<repositories> 和 <pluginRepositories> 分别用于配置项目依赖库和插件库的远程仓库。每个仓库配置包含以下关键部分:

  • <id>:仓库的唯一标识符,用于在项目中引用该仓库,名称可自定义。
  • <name>:描述该仓库的用途或来源,通常为自定义名称。
  • <url>:仓库的访问地址,此处为中央仓库的中国镜像。
  • <releases> 和 <snapshots>:控制是否启用发布版本和快照版本的下载。
    • <releases><enabled>true</enabled></releases>:允许从该仓库下载发布版本(release)。
    • <snapshots><enabled>false</enabled></snapshots>:禁止从该仓库下载快照版本(snapshot)。

注意事项

  1. 配置多个远程仓库:可以在 <repositories> 或 <pluginRepositories> 标签下配置多个远程仓库,每个仓库都有其独立的 id 和 url。
  2. 禁用快照版本:不推荐从公共仓库下载快照版本,因为这些构件不稳定且不受你控制。如果需要使用组织内部的私有仓库,可启用快照版本支持。
  3. 仓库优先级:Maven 按配置顺序查询仓库,先配置的仓库优先被查询。

# 远程仓库配置的注意事项

  • 优先本地仓库:Maven 优先从本地仓库查找依赖项,如果本地仓库没有依赖,才会从远程仓库下载。
  • 快照版本管理:建议在项目中避免使用不稳定的快照版本(snapshots),除非是开发阶段。
  • 镜像配置:如果网络环境不佳,可以配置中央仓库的镜像地址,如中国的镜像仓库,提升下载速度。

# 配置Maven 仓库按顺序加载

在 Maven 项目中,仓库的加载顺序是一个重要的配置项,特别是在项目依赖管理和构建过程中。通过合理配置仓库加载顺序,可以确保 Maven 优先从你指定的仓库中获取依赖,避免不必要的网络延迟或依赖冲突。

# 1. 在 pom.xml 中配置仓库顺序

pom.xml 是 Maven 项目的配置文件,可以为每个项目单独配置仓库的加载顺序。我们可以在 pom.xml 中配置多个远程仓库,并让 Maven 按顺序加载它们。

<repositories>
  <!-- 优先从 Scholar 仓库加载 -->
  <repository>
    <id>nexus-scholar</id>
    <url>https://nexus.wym123.cn/repository/maven-public/</url>
  </repository>
  
  <!-- 然后从阿里云公共仓库加载 -->
  <repository>
    <id>aliyunmaven</id>
    <url>https://maven.aliyun.com/repository/public</url>
  </repository>
  
  <!-- 最后从 Nexus aliyun 加载 -->
  <repository>
    <id>nexus-aliyun</id>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  </repository>
</repositories>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

步骤解析:

  • Maven 会按照 pom.xml 中定义的顺序依次尝试每个远程仓库。
  • 如果 nexus-scholar 中没有找到依赖,Maven 会继续尝试从 aliyunmaven 获取,最后是 nexus-aliyun。

# 2. 在 settings.xml 中配置全局仓库顺序

如果你希望全局设置所有 Maven 项目都按照特定的仓库顺序加载依赖,可以在 settings.xml 中配置全局仓库。这个配置适用于所有 Maven 项目,而不仅仅是单个项目。

配置方法:

  1. 定位 settings.xml 文件:

    • 位置:通常在 ~/.m2/settings.xml(Linux 和 macOS)或 C:\Users\你的用户名\.m2\settings.xml(Windows)。
  2. 配置仓库顺序:

    • 使用 <profiles> 元素在 settings.xml 中定义全局仓库顺序。
    • 激活该 profile,使其对所有项目生效。

示例配置:

<settings>
  <!-- 其他配置 -->
  
  <profiles>
    <profile>
      <id>custom-repos</id>
      <repositories>
        <!-- 优先从 Scholar 仓库加载 -->
        <repository>
          <id>nexus-scholar</id>
          <url>https://nexus.wym123.cn/repository/maven-public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>

        <!-- 然后从阿里云公共仓库加载 -->
        <repository>
          <id>aliyunmaven</id>
          <url>https://maven.aliyun.com/repository/public</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>

        <!-- 最后从 Nexus aliyun 加载 -->
        <repository>
          <id>nexus-aliyun</id>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>

  <!-- 自动激活全局配置 -->
  <activeProfiles>
    <activeProfile>custom-repos</activeProfile>
  </activeProfiles>
</settings>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

配置解析:

  • 全局生效:所有 Maven 项目都会使用这个 profile 中定义的仓库顺序。
  • 自动激活:通过在 <activeProfiles> 中定义 custom-repos,确保每次 Maven 构建时都使用该仓库顺序。

注意事项

  • 仓库可用性:确保你配置的仓库是可用的,并且包含你项目所需的依赖。否则,Maven 在按顺序尝试这些仓库时可能无法找到依赖,导致构建失败。
  • 排除不需要的仓库:在一些情况下,你可能希望排除某些仓库,可以使用 <mirrorOf> 和排除规则来实现(如 !central)。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Maven 安装配置
Maven 项目构建

← Maven 安装配置 Maven 项目构建→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式