maven 仓库

1,360 阅读5分钟

仓库类型

  • 本地仓库:位置默认在 {user}/.m2目录下

  • maven官方中央仓库:是maven远程仓库的默认值,是主流框架、工具包等jar包的官方发布渠道,地址为 repo.maven.apache.org/maven2

  • 其他maven仓库:比如华为maven仓库、某公司局域网内部maven仓库。这些maven仓库一般都是每隔一段时间就会与maven官方中央仓库同步,除此之外还可能包含maven官方中央仓库中下载不到的一些包。

依赖下载过程

  • 下载依赖时,首先检查本地仓库,如果本地仓库中没有,就去远程仓库下载并缓存到本地仓库中。

配置远程仓库或镜像

以下情况可能需要我们配置自定义的远程仓库或镜像

  • 默认的 maven官方中央仓库 下载速度慢
  • 有些依赖项 maven官方中央仓库 中没有

maven 提供了1种配置镜像的方法和3种配置远程仓库的方法

  • 镜像:通过 {user}/.m2/settings.xml 中的 settings.mirrors.mirror 配置

  • 全局profile仓库:通过 {user}/.m2/settings.xml 中的 settings.profiles.profile.repositories.repository 配置

  • 项目仓库:通过 pom.xml 中的 project.repositories.repository 配置远程仓库

  • 项目profile仓库:通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置远程仓库

配置镜像

作用范围:所有使用该 settings.xml 文件的maven项目

步骤:打开{user}/.m2/settings.xml,在settings.mirrors中添加类似如下配置

<mirror>
  <id>mirror</id>
  <mirrorOf>central</mirrorOf>
  <name>maven镜像</name>
  <url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>

注意 <mirrorOf>central</mirrorOf> 这行xml,它表示 所有对 id 叫 central 的 maven 仓库的请求,全部转发到https://mirrors.huaweicloud.com/repository/maven/中

这个 id 叫 central 的 maven 仓库是哪来的呢?

参考pom-4.0.0.xml 这一小结

除了 central 这个默认仓库的id之外,mirrorOf 还可以填写来自以下三个地方的id

  • 通过 {user}/.m2/settings.xml 中的 settings.profiles.profile.repositories.repository 配置的远程仓库的id

  • 通过 pom.xml 中的 project.repositories.repository 配置的远程仓库的id

  • 通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置的远程仓库的id

配置多镜像

应用场景:需要对不同仓库的请求转发到不同的镜像仓库中

如下:一个转发到了huaweicloud 一个转发到了 163

<mirrors>
    <mirror>
      <id>mirror1</id>
      <mirrorOf>repo1</mirrorOf>
      <name>maven镜像1</name>
      <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </mirror>
    <mirror>
      <id>mirror2</id>
      <mirrorOf>repo2</mirrorOf>
      <name>maven镜像2</name>
      <url>http://uni.mirrors.163.com/</url>
    </mirror>
<mirrors>

mirror

在 maven 中 mirror(镜像)和 repository(仓库)是不同的概念

mirror的作用:将 对A仓库的请求转发到B仓库

  • 没有配置 mirror时

  • 配置了 mirror

    此时,B 仓库被称为A 仓库的镜像。

从上面可以看出 mirror 也是一个仓库,但它是一个特别的仓库,它具有拦截其他仓库请求并转发到自己仓库的功能

mirror的mirrorOf值,还提供了多种写法

  • <mirrorOf>central</mirrorOf>:转发对central仓库的请求
  • <mirrorOf>repo1,repo2</mirrorOf>:转发对repo1,repo2仓库的请求
  • <mirrorOf>*</mirrorOf>:转发对所有仓库的请求
  • <mirrorOf>*,!repo1</mirrorOf>:转发对所有仓库的请求,除了repo1以外

注意!镜像仓库会完全屏蔽掉 被镜像仓库,即镜像仓库失效后,maven也不会再去访问被屏蔽掉的仓库。

参考

配置项目仓库

作用范围:该pom文件所在的项目

步骤:打开pom.xml文件,在根节点下,加入下列配置

<repositories>
    <repository>
        <name>华为maven仓库</name>
        <id>huawei</id>
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <name>华为maven插件仓库</name>
        <id>huaweiPlugin</id>
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </pluginRepository>
</pluginRepositories>

注意 repositories.repository.id 这个节点,它表示的是该仓库的唯一标识。 所谓的唯一标识,指的是,在一个项目的所有pom文件(多模块的项目会有多个pom文件)和该项目对应的settings.xml文件中,有且仅有一个使用了该id的远程仓库

<pluginRepositories> 是插件仓库,有时候依赖下载的很快,但是插件下载的很慢,就可以配置插件仓库

全局profile仓库 和 项目profile仓库

这两个的作用范围都是当前环境。

关于 maven profile,可以参考这篇文章spring profile 与 maven profile 多环境管理

一般情况下,开发环境、测试环境、正式环境 用的都是一套maven仓库,如果你有不同环境对应不同仓库的需求,那就在 profile 中加 repositories吧,全局profile仓库 和 项目profile仓库配置方法都一样。如下所示

<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
                      https://maven.apache.org/xsd/settings-1.0.0.xsd">
    ...
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <repositories>
                <repository>
                    <name>华为maven仓库</name>
                    <id>huawei</id>
                    <url>https://mirrors.huaweicloud.com/repository/maven/</url>
                </repository>
            </repositories>
        </profile>
        <profile>
            <id>test</id>
            <repositories>
                <repository>
                    <name>163 maven仓库</name>
                    <id>163.com</id>
                    <url>http://uni.mirrors.163.com/</url>
                </repository>
            </repositories>
        </profile>
    </profiles>
    ...
</settings>