1. maven仓库配置
1.1. maven项目使用的仓库一共有如下几种方式
- 中央仓库,这是默认的仓库
- 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置
- 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置
- 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置
- 项目profile仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置
- 本地仓库
如果所有配置都存在,依赖的搜索顺序就会变得异常复杂。
1.2. 仓库优先级
- settings_mirror 的优先级高于 central
- settings_profile_repo 优先级高于 settings_mirror
- settings_profile_repo 优先级高于 pom_repositories
- settings_profile_repo 优先级高于 pom_profile_repo
- pom_profile_repo 优先级高于 pom_repositories
- pom_repositories 优先级高于 settings_mirror
即:local_repo > settings_profile_repo > pom_profile_repo > pom_repositories (定义多个repository,按定义顺序找) > settings_mirror > central
本地仓库(localRepositories) > profile 中的 repositories 仓库 > POM > mirrors 全局仓库
注意:
1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址
2、mirrorOf等于*的时候覆盖所有repository配置
3、存在多个mirror配置的时候mirrorOf等于*放到最后
4、只配置mirrorOf为central的时候可以不用配置repository
mirror 与 repository 配置优先级
mirror 优先级 高于 repository 配置。 特别是 mirror 配置了 mirrorOf等于 * , 那么 repository 配置就失效了。 参考 maven中mirror与repositories的关系 - 简书
maven获取真正起作用的repository集合流程:首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素, 如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository, 如果该repository找不到对应的mirror, 则使用其本身,依此可以得到最终起作用的repository集合, repositories中默认包含了中央仓库central,当然也可以重新它的url; 可以理解mirror是复写了对应id的repository
2. 通过mirror配置
如果仓库X可以提供仓库Y所有的内容,那么我们就可以认为X是Y的一个镜像,通俗点说,可以从Y获取的构件都可以从他的镜像中进行获取。可以采用镜像的方式配置远程仓库,镜像在settings.xml中进行配置,在setting.xml 中的 <mirrors> 标签下加入如下子标签配置便配置了一个maven镜像。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<!--mirrorOf的配置很重要后面会详细说明-->
<mirrorOf>central</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
添加如上配置后,maven会读取setting.xml中配置的mirror作为jar包的下载地址,我们以在项目中下载fastjson为例来看一下效果。
可以看到,配置了上面的mirror后,maven是从aliyun仓库下载的jar包,不配置的时候,默认从apache的maven中央仓库下载的jar包。
上面提到,<mirrorOf></mirrorOf> 的设置很重要,比如上面我设置的 mirrorOf 为<mirrorOf>central</mirrorOf>,如果 <mirrorOf></mirrorOf> 我随便设置一个参数,如<mirrorOf>abc</mirrorOf>,这时候我们配置的仓库就不起作用了,这是因为 maven 默认内置了如下一个仓库,这个默认仓库的 id 为 central,当我们把 mirrorOf 设置为 <mirrorOf>central</mirrorOf> 时,maven 就会查找有没有 id 为 central 的仓库,然后把 id 为 central 的仓库地址换成我们 <mirror> 标签配置的那个 url,这样我们配置的 mirror 才会起作用。当然我们也可以把 mirrorOf 设置为 <mirrorOf>*</mirrorOf>,表示所有仓库都使用我们配置的这个 mirror 作为 jar 包下载地址。
<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>
3. 通过 <repositories> 配置
通过 setting.xml 方式配置会对所有 maven 项目生效,如果只想在本项目中配置一个 maven 仓库,可以通过在 pom.xml 中配置 <repositories> 标签来实现。在自己的 maven 项目的 pom.xml 中添加如下配置,就配置好了一个仓库。这时候,maven 会优先采用这个配置,而不会去读 setting.xml 中的配置了。这样配置好后,maven 就会自动从 aliyun 下载 jar 包了。
<repositories>
<repository>
<id>aliyun-releases</id>
<name>阿里云仓库(name可以随便起)</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
repositories 标签下可以配置多个 repository,如果我们配置了多个 repository,maven 会用哪个呢,答案是按出现顺序使用,如果第1个可用,就用第一个,如果不可用,就依次往下找,下面的2张图片可以说明这个问题。
上面配置 <repository> 时 <id> 似乎也没什么用,确实是,如果你只是在 pom.xml 中配置个仓库,这个 id是没什么用的,可以随便写,其实这个 id 是配合上面讲的 mirror 一块使用的,还记得 mirrorOf 吗,我们配置mirrorOf 为 <mirrorOf>central</mirrorOf> 时,mirror 中的 url 就是 central 仓库的 url 给覆盖了,所以这里的 <repository> 标签下的 id 是给 mirrorOf 用的。
可以看下面一个例子,本来我们的 abc-releases 这个仓库是不可用的,因为根本就没有https://abc.def.com/repository/public/ 这个仓库,但是我们通过 mirror 配置,改变了 id 为 abc-releases 这个仓库的 url,从而使用 maven 也可以从 id 为 abc-releases 这个仓库下载 jar 包了。当然这样配置也没只啥意义,只是为了方便理解 repository 和 mirror 之间的关系。
4. maven仓库配置的其他选项
<!--releases和snapshots中有个enabled属性,是个boolean值,默认为true,
表示是否需要从这个远程仓库中下载稳定版本或者快照版本的构建,
一般使用第三方的仓库,都是下载稳定版本的构建。-->
<repository>
<id>aliyun-releases</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
5. maven默认的内置仓库的配置位置
<!--
可以从以下文件中找到maven仓库的默认配置如下
apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar\org\apache\maven\model\pom-4.0.0.xml
-->
<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>