Maven配置中pom.xml和setting.xml之间的关系

发布时间 2023-07-31 19:18:15作者: 浪迹天涯的派大星

在日常的开发中,我们拿IDEA举例,一般会在电脑上自行下载安装Maven,然后在IDEA中配置我们安装的Maven路径,通过修改setting.xml文件,例如配置公共的镜像仓库地址,来提高依赖下载速率;或者配置内部私有的镜像仓库地址,来引入一些私有的依赖等等。

1、如何从指定的镜像仓库下载依赖

如下图在项目的pom.xml文件中增加<repositories>和<repository>标签,配置指定的镜像仓库ID和url,此处配置是项目全局生效

<project>
  ...
  <repositories>
    <repository>
      <id>my-repo</id>
      <url>http://example.com/maven-repo</url>
    </repository>
  </repositories>
  ...
</project>

如果只想针对部分依赖项指定镜像仓库地址,可以如下配置:

<dependencies>
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0.0</version>
    <repositories>
      <repository>
        <id>my-repo</id>
        <url>http://example.com/maven-repo</url>
      </repository>
    </repositories>
  </dependency>
</dependencies>

如果仓库存在认证需求,可以采用如下配置:

注:<repositories>下可以配置多个<repository>,也就是多个镜像仓库地址,首先会在本地仓库寻找,如果本地不存在,则会按配置的远程仓库列表顺序下载(此时会在setting文件中查找对应的镜像地址),直到找到为止。

2、Maven的setting.xml文件

Maven的setting.xml文件配置结构如下,id和name随意,保持唯一即可,可以配置多个镜像地址,一般至少要配置中央仓库(central)和公司的私有镜像。

<mirrors>
    <mirror>
        <id>mirrorId</id>
        <mirrorOf>mirrorOf</mirrorOf> 
        <name>mirrorName</name>
        <url>mirrorUrl</url>
    </mirror> 
</mirrors>

注:其中的mirrorOf需要和pom文件<repository>中的id保持一致,表示仓库地址镜像。实际查找时,在setting文件中寻找和pom中的id相同的mirror,使用mirror中的url,替换掉pom文件中配置的仓库地址。

如果仓库存在认证,则可以增加如下配置,配置账号和密码,此处的<server>标签中id和pom中的<repository>标签中的id保持一致。

<settings>
  ...
  <servers>
    <server>
      <id>my-repo</id>
      <username>my-username</username>
      <password>my-password</password>
    </server>
  </servers>
  ...
</settings>

mirrorOf存在匹配规则,例如central默认是中心仓库;* 表示匹配所有仓库;使用逗号分隔的值来指定需要使用镜像仓库的多个远程仓库;或者使用"external:"来匹配所有非Maven核心仓。(external:* 是一个特殊的值,Maven 会先尝试从本地的仓库或其他已配置的镜像中获取依赖项,如果没有匹配的结果,才会尝试使用 external:* 指定的镜像)

3、依赖下载顺序

1、首先会在本地仓库查找是否存在,如果存在则直接使用

2、如果本地仓库不存在,且pom文件配置了仓库地址,则采用setting文件中配置的对应ID的镜像仓库地址,如果不存在镜像地址,则采用pom文件中配置的url。

3、如果本地仓库不存在,pom文件也未配置仓库地址,则采用setting文件中配置的中央仓库(mirrorOf=central)地址,如果不存在中央仓库地址,则会使用maven官方的中心仓库下载地址。

注:<repositories>可以配置多个仓库地址,单个的查找逻辑和上面的一样,第一个仓库不存在,则按顺序从后续仓库下载,直到下载到。

4、配置的地址无法下载或者不生效解决方法

  • 检查idea中配置的maven是否正确(自己下载的maven、setting.xml文件地址)
  • 清除本地maven仓库中下载失败的文件,一般以.lastUpdated结尾,清空文件夹即可
  • 查看pom中配置的id和setting中的mirrorOf是否对应,并验证setting.xml文件中配置镜像地址是否可以在浏览器访问
  • 如果以上都正确,可以尝试下,不要点击maven的reload按钮,直接点击maven的编译按钮,看看是否可以下载下来
  • 如果还是不生效,可以尝试清除idea的缓存,并重启idea