Maven多处配置仓库及其优先级

1. maven仓库配置

1.1. maven项目使用的仓库一共有如下几种方式

  1. 中央仓库,这是默认的仓库
  2. 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置
  3. 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置
  4. 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置
  5. 项目profile仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置
  6. 本地仓库

如果所有配置都存在,依赖的搜索顺序就会变得异常复杂。

1.2. 仓库优先级

  1. settings_mirror 的优先级高于 central
  2. settings_profile_repo 优先级高于 settings_mirror
  3. settings_profile_repo 优先级高于 pom_repositories
  4. settings_profile_repo 优先级高于 pom_profile_repo
  5. pom_profile_repo 优先级高于 pom_repositories
  6. 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>

  • 39
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多个maven仓库配置的场景下,可以考虑使用Maven多个仓库配置功能来提高构建和依赖管理的灵活性。 首先,在pom.xml文件中配置多个仓库,可以通过在`<repositories>`标签下添加多个`<repository>`标签实现。每个`<repository>`标签中需要配置仓库的URL、ID等相关信息。 其次,可以根据需要,针对每个仓库配置不同的优先级Maven解析仓库时,会按照仓库优先级顺序进行搜索。可以通过在`<repositories>`标签中添加`<releases>`和`<snapshots>`标签来分别为发行版和快照版本配置优先级策略。例如,可以将稳定版本的仓库设置为优先级较高的仓库,以确保项目在构建时使用最新的稳定版本依赖。 此外,还可以通过使用统一的父项目,对多个子项目的仓库进行统一配置。通过在父项目的pom.xml文件中配置仓库,可以避免在每个子项目中重复配置。 另外,Maven还提供了缓存功能,可以通过在`<settings>`标签下的`<localRepository>`标签中配置本地仓库路径,以方便构建过程中的依赖缓存和重用。 最后,针对国内用户,在配置多个maven仓库时,可以考虑配置国内镜像仓库,以提高依赖下载速度。可以通过在`<settings>`标签下的`<mirrors>`标签中配置国内镜像仓库的URL,将官方仓库替换为国内镜像仓库。 总之,通过合理配置多个maven仓库,可以提高项目的构建效率和依赖管理的灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值