maven多个仓库查询的优先级顺序案例讲解

 更新时间:2023年04月23日 11:12:34   作者:IT人的天地  
这篇文章主要介绍了maven多个仓库查询的优先级顺序,考虑到我们常用的配置文件是conf/settings.xml和工程里面的pom.xml文件,我们针对这两个文件的结合来分析仓库的使用顺序,需要的朋友可以参考下

上一篇我们详解了setttings.xml的配置项,里面的配置项基本都和仓库有关系,我们使用maven更多的也是要从仓库下载jar包,然后也把我们自己公共的jar包上传到仓库。由于我们是可以配置多个仓库的,这时候就涉及到了一个问题:下载一个jar包时,怎么确定这些仓库的使用顺序?

1、官网的解释

maven官网对这个问题给了一定的解答,如下:

Remote repository URLs are queried in the following order for artifacts until one returns a valid result:

1. effective settings:

1. Global settings.xml

2. User settings.xml

2. local effective build POM:

1. Local pom.xml

2. Parent POMs, recursively

3. Super POM

3. effective POMs from dependency path to the artifact.

For each of these locations, the repositories within the profiles are queried first in the order outlined at Introduction to build profiles.

Before downloading from a repository, mirrors configuration is applied.

All profile elements in a POM from active profiles overwrite the global elements with the same name of the POM or extend those in case of collections. In case multiple profiles are active in the same POM or external file, the ones which are defined later take precedence over the ones defined earlier (independent of their profile id and activation order).

If a profile is active from settings, its values will override any equivalently ID'd profiles in a POM or profiles.xml file.

Take note that profiles in the settings.xml takes higher priority than profiles in the POM.

简单翻译一下,就是:

  • • 全局配置文件settings.xml中的配置项的优先级最高,也就是maven安装目录下的conf/settings.xml优先级最高
  • • 其次是用户级别的配置文件优先级次高,默认是${user.home}/.m2/settings.xml
  • • 最后就是本地的pom.xml文件优先级次次高
  • • 当确定了要查询某个仓库时,会先看这个仓库有没有对应的镜像仓库,如果有的话,则转向去查镜像仓库,也就是会查当前仓库的替代品(镜像仓库),跳过对本仓库的检索
  • • 如果同一个pom文件里面有多个激活的profile,则靠后面激活的profile的优先级高
  • • 针对pom文件,如果有激活的profile,且profile里面配置了repositories,则profile里面的repositories的仓库优先级比标签下面的repositories的优先级高
  • • pom文件中无论是project标签下面直接定义的repositories,还是profile标签下面定义的repositories,repositories内部的repository的查询顺序,都是按照仓库定义的顺序查询,也就是自上而下查询。
  • • 如果settings.xml中的profile的id和pom文件中的profile的id一样,则以settings.xml中的profile中配置的值为准
  • • 如果同一个pom文件中有多个profile被激活,那么处于profiles内部靠后面生效的profile优先级比profiles中靠前的profile的优先级高

也就是整体的优先级方面:

conf/settings.xml > ${user.home}/.m2/settings.xml >本地的pom.xml文件

2、案例讲解

考虑到我们常用的配置文件是conf/settings.xml和工程里面的pom.xml文件,我们针对这两个文件的结合来分析仓库的使用顺序。

假如我们有如下的全局配置文件:settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">

<localRepository>D:/programs/.m2/repository</localRepository>

  <servers>
    <server>
      <id>dev</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
  </servers>

  <mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror> 
    <mirror>
      <id>dev-mirror</id>
      <mirrorOf>dev1</mirrorOf>
      <name>第二套开发仓库</name>
      <url>http://192.168.1.2/repository/devM</url>
    </mirror> 
  </mirrors>

  <profiles>
    
    <profile>
      <id>env-dev</id>
      <repositories>
        <repository>
          <id>dev5</id>
          <name>Repository for JDK 1.4 builds</name>
          <url>http://192.168.1.1/repository/dev5</url>
        </repository>
      </repositories>
    </profile>

    <profile>
      <id>env-test</id>
      <repositories>
        <repository>
          <id>test</id>
          <name>test</name>
          <url>http://192.168.1.1/repository/test</url>
        </repository>
      </repositories>
    </profile>

  </profiles>

  <activeProfiles>
    <activeProfile>env-dev</activeProfile>
  </activeProfiles>

</settings>

工程的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>test</artifactId>
    <version>${revision}</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <revision>1.0.0</revision>
    </properties>

    <repositories>
    <repository>
      <id>dev4</id>
      <name>dev4</name>
      <url>http://192.168.1.1/repository/dev4</url>
    </repository>
  </repositories>

  <profiles>
    <profile>
      <id>profile-1</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>dev1</id>
          <name>dev1</name>
          <url>http://192.168.1.1/repository/dev1</url>
        </repository>
        <repository>
          <id>dev2</id>
          <name>dev2</name>            <url>http://192.168.1.1/repository/dev2</url>
        </repository>
      </repositories>
    </profile>
    <profile>
      <id>profile-2</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>dev3</id>
          <name>dev3</name>
         <url>http://192.168.1.1/repository/dev3</url>
        </repository>
      </repositories>
    </profile>
  </profiles>

</project>

2.1、settings.xml和pom都配置激活了各自的profile

pom.xml文件默认激活了profile-1和profile-2,settings中默认激活了env-dev。按照在同一文件的profile的生效顺序规则,pom文件中的仓库使用顺序为

dev5->dev3->dev1->dev2->dev4->central(超级pom中定义的中央仓库),

而由于在setttings.xml中为dev1和central配置了镜像仓库,所以最终仓库的优先查询顺序为:

dev5->dev3->dev-mirror->dev2->dev4->nexus-aliyun

2.2、settings.xml没有配置激活的profile,pom中配置了激活的profile

这种情况下,settings中没有设置activeProfiles,我们只需要考虑pom文件中仓库的查询顺序,按照先前说的规则:

  • • 如果同一个pom文件里面有多个激活的profile,则靠后面激活的profile的优先级高
  • • 针对pom文件,如果有激活的profile,且profile里面配置了repositories,则profile里面的repositories的仓库优先级比标签下面的repositories的优先级高
  • • pom文件中无论是project标签下面直接定义的repositories,还是profile标签下面定义的repositories,repositories内部的repository的查询顺序,都是按照仓库定义的顺序查询,也就是自上而下查询。

则仓库使用顺序为

dev3->dev1->dev2->dev4->central(超级pom中定义的中央仓库),

而由于在setttings.xml中为dev1和central配置了镜像仓库,所以最终仓库的优先查询顺序为:

dev3->dev-mirror->dev2->dev4->nexus-aliyun

3、仓库配置建议

maven官方不建议在settings中配置profile,因为profile中配置的一些属性或者仓库基本都是为项目服务的,我们的项目可以通过代码仓库(比如gitlab)进行共享,但是settings配置文件一般很难共享。如果我们的项目依赖了自己本地的settings文件中的一些配置信息,但是其他同事本地的settings文件又没这些信息,那么其他同事就无法正常的运行项目。而且profile中定义的信息一般都和项目运行的环境有关,比如有开发环境的配置,测试环境的配置,还有生产环境的配置。既然和项目有直接的紧密关系,就应该将其配置到项目里面。

3.1 针对仓库配置的建议

  • • 如果仓库和环境无关,可以将仓库配置到pom文件的结点下面
  • • 如果不同环境使用不同的仓库,则可以通过在pom文件中定义profile,并在profile结点下面配置仓库

3.2、针对settings文件的配置

seetings文件建议用来配置下列几项

  • • 配置本地仓库路径,即配置localRepository
  • • 配置中央仓库的镜像,即配置mirrors
  • • 配置访问仓库的认证信息,即配置servers

到此这篇关于maven多个仓库查询的优先级顺序的文章就介绍到这了,更多相关maven多个仓库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于java file 文件操作operate file of java的应用

    基于java file 文件操作operate file of java的应用

    本篇文章介绍了,基于java file 文件操作operate file of java的应用。需要的朋友参考下
    2013-05-05
  • java中int转string与string转int的效率对比

    java中int转string与string转int的效率对比

    这篇文章主要介绍了java中int转string与string转int的效率对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中从Integer到Date的转换方法

    Java中从Integer到Date的转换方法

    这篇文章主要介绍了Java中integer怎么转换date,在Java中,如果我们有一个Integer类型的数据,想要将其转换为Date类型,本文给大家介绍了实现方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-05-05
  • Java面试题冲刺第十三天--数据库(3)

    Java面试题冲刺第十三天--数据库(3)

    这篇文章主要为大家分享了最有价值的三道数据库面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot3.3.0升级方案

    SpringBoot3.3.0升级方案

    本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案,新版本的升级可以解决旧版本存在的部分漏洞问题,感兴趣的可以了解一下
    2024-08-08
  • 将JavaWeb项目部署到云服务器的详细步骤

    将JavaWeb项目部署到云服务器的详细步骤

    这篇文章主要介绍了将JavaWeb项目部署到云服务器的详细步骤,文章通过图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • 为什么不推荐使用BeanUtils属性转换工具示例详解

    为什么不推荐使用BeanUtils属性转换工具示例详解

    这篇文章主要介绍了为什么不推荐使用BeanUtils属性转换工具,本文通过示例代码给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 浅谈Java中@Autowired和@Inject注解的区别和使用场景

    浅谈Java中@Autowired和@Inject注解的区别和使用场景

    本文主要介绍了浅谈Java中@Autowired和@Inject注解的区别和使用场景,@Autowired注解在依赖查找方式和注入方式上更加灵活,适用于Spring框架中的依赖注入,而@Inject注解在依赖查找方式上更加严格,适用于Java的依赖注入标准,感兴趣的可以了解一下
    2023-11-11
  • springboot集成nacos读取nacos配置数据的原理

    springboot集成nacos读取nacos配置数据的原理

    这篇文章主要介绍了springboot集成nacos读取nacos配置数据的原理,文中有详细的代码流程,对大家学习springboot集成nacos有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • spring 和 spring boot 中的属性配置方式

    spring 和 spring boot 中的属性配置方式

    这篇文章主要介绍了spring 和 spring boot 中的属性配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论