开发过程中,时常被maven中的仓库搞得头晕,不知道为什么这里配置的没生效,而那里没配置却又生效了,到底生效的配置在什么地方。于是自己便摸索、总结了一下。

仓库

首先,仓库有三种,中央仓库,镜像仓库,本地仓库。

  • 中央仓库是maven的官方仓库。
  • 镜像仓库,常用的有阿里的,网易的,华为的等等。这些仓库都是中央仓库的拷贝,基本和中央仓库同步。不过既然是去中央仓库拷贝的,那么肯定存在时间差,有时候就会落后一些。除此之外,镜像仓库有时候还会含有一些特殊的依赖,比如开发人员上传的第三方jar包,但是没往中央仓库传的。所以,镜像仓库基本可以说是中央仓库的超集。
  • 本地仓库即setting.xml文件中localRepository标签里配置的地址。

三种仓库的优先级是本地 > 远程(中央、镜像实际开发中通常二选一,尽量不要混用)。

mirror

settings.xml文件中的mirror标签,作用类似于拦截器。

pom.xml中的repository标签是在两个维度起作用的,可以联合使用(至于在settings.xmlprofile标签里配置仓库,作用和此类似,本文就不做说明了)。

情景

情景一、不配置mirror,仅在POM里配置仓库

pom.xml:

<repositories>
    <repository>
        <id>nexus21</id>
        <name>nexus</name>
        <url>http://192.168.244.129:8081/repository/maven-public/</url>
        <layout>default</layout>
        <releases>
            <enabled>true</enabled> <!-- 是否开启发布版构件下载 -->
        </releases>
        <snapshots>
            <enabled>true</enabled> <!-- 是否开启快照版构件下载 -->
        </snapshots>
    </repository>
</repositories>

仓库是可以配置多个的,配多个就一起起作用(尽量保证每个库中的依赖不同,不然容易冲突)。区分它们的标记就是id,中央仓库的id是central,所以如果你想覆盖它,就给你配的仓库起名为central。此例,生效的仓库为两个,中央仓库central和配置的此仓库nexus21

情景二、配置mirror,且POM里配置仓库

pom.xml: 同上

settings.xml:

<mirror>
      <id>nexus</id>
      <mirrorOf>central</mirrorOf>
      <name>nexus maven</name>
      <url>http://192.168.244.128:8081/repository/maven-public/</url>
</mirror>

<!-- mirror相当于拦截器,若有仓库id和mirrorOf值一样,则该仓库被拦截,转到mirror地址上下载 -->
<mirror>
    <id>nexus21</id>
    <mirrorOf>nexus21</mirrorOf>
    <blocked>false</blocked> <!-- 放开只能使用https的限制,3.8.1版本以上打开,生产环境慎用 -->
    <name>nexus maven</name>
    <url>http://192.168.244.130:8081/repository/maven-public/</url>
</mirror>

配置mirror后,mirrormirrorOf就是要拦截的仓库id,拦截之后,转而去mirrorurl里配的地址下载依赖,此时repository里配的url就失效了。此例,生效的仓库为两个,中央仓库central被转到私服128上了,而自己配的仓库nexus21被转到了私服130上了,而不是去129下载。