maven访问仓库的顺序

发布时间 2023-12-08 15:32:11作者: 爱喝茶的安迪

repository仓库配置文件有3个地方:

1、默认中央仓库:Maven安装目录下 lib/maven-model-builder-${version}.jar 中 \org\apache\maven\model\pom-4.0.0.xml 文件配置着默认中央仓库,它是所有Maven POM的父POM,所有Maven项目继承该配。

<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>

2、settings.xml:在Maven安装目录下 conf/settings.xml。

3、pom.xml:在项目中的pom.xml文件。

<!-- 阿里仓库 -->
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<!-- 是否开启发布版构件下载 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启快照版构件下载 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

仓库可以简单地认为只有2种:本地仓库、远程仓库(私库),中央仓库(可以看作一种默认的远程仓库)。

不管是仓库<repository>还是镜像<mirror>最重要的就是<id>和<url>属性。

<id>aliyunmaven</id>
<url>https://maven.aliyun.com/repository/public</url>

mirror和epository关系
mirror相当于 repository 的拦截器,把请求 repository 地址重定向到mirror里配置的地址,所以配置 mirror 时 mirrorOf 值很重要不能随便写,
mirrorOf 要和 repository 的 id 值保持一致,如果 mirrorOf 配置的是 * 或 central 时,repository 可以不用配置,因为pom-4.0.0.xml文件中配置了一个默认中央仓库,而 * 则代表拦截所有repository ,所以也不用配置,mirrorOf 除了 * 或 central 外的其他值都必须配置 repository 的 id。

比如<mirrorOf>central</mirrorOf>就会拦截中央仓库,

<mirrors>
<!-- 给定仓库的下载镜像。 -->
<mirror>
<!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>planetmirror.com</id>
<!-- 镜像名称 -->
<name>PlanetMirror Australia</name>
<!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://downloads.planetmirror.com/pub/maven2</url>
<!-- 镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库的镜像,就需要将该元素设置成central。
这必须和中央仓库的id central完全一致。 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

比如<mirrorOf>*</mirrorOf>就会拦截所有远程仓库(私库)和中央仓库。 

<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

仓库主要分为本地仓库、远程仓库(私库)、中央仓库(可以看作一种默认的远程仓库)。

profile是用来方便切换环境,本质上就是一种普通的远程仓库(私库),只不过有先后顺序,相同仓库id会覆盖前面的仓库,而镜像会拦截<mirrorOf>对应仓库id,

mirror和epository优先级
拉取jar包时的优先级别:pom.xml中repository > settings.xml中mirror > settings.xml中repository > 默认中央仓库,存在多个mirror配置的时候mirrorOf 等于 * 放到最后,同级别的 repository 根据 配置的先后顺序倒序

 

settings.xml 文件一般存在于两个位置:

全局配置(global settings): ${maven.home}/conf/settings.xml
用户配置(user settings): ${user.home}/.m2/settings.xml,idea中配置的User settings file位置,会合并${maven.home}/conf/settings.xml中内容。
注意:用户配置优先于全局配置。${user.home}

配置优先级:局部配置优先于全局配置。

配置优先级从高到低:pom.xml > user settings > global settings

如果这些文件同时存在,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。

所以注意:

由于我们常常会在IDEA中手动选择一个settings.xml文件(用户配置),会和全局配置 ${maven.home}/conf/settings.xml中内容合并,

所以千万不要在${maven.home}/conf/settings.xml中如下配置<mirrorOf>*</mirrorOf>会拦截所有远程仓库(私库),导致私库中的jar包不能正常拉取。

<!-- 不要这样配置 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

正确如下配置只拦截中央仓库<mirrorOf>central</mirrorOf>

<!-- 推荐 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

settings.xml配置主要如下参数:

LocalRepository:配置本地仓库位置路径。idea中Local repository会覆盖这个路径。
Servers:主要是配置私库的用户名和密码。
Mirrors:镜像仓库。
Profiles:根据环境参数来调整构建配置的列表。比如方便切换生产环境和测试环境。
ActiveProfiles:手动激活profiles的列表

pom.xml远程仓库(私库)

<!-- 阿里仓库 -->
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<!-- 是否开启发布版构件下载 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启快照版构件下载 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

settings.xml参考如下

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/settings-1.2.0.xsd">

<!--本地仓库路径-->
<localRepository>D:/Works/repository</localRepository>
<pluginGroups></pluginGroups>
<proxies></proxies>

<servers>
<server>
<!--该id与distributionManagement中repository元素的id相匹配。 -->
<!--或者profiles.profile.repositories.repository.id相匹配。-->
<id>env-dev</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>

<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>


<profiles>
<!--测试环境-->
<profile>
<id>env-test</id>
<repositories>
<repository>
<id>nexus-test</id>
<url>http://192.168.111.201:7000/nexus/content/groups/public</url>
</repository>
</repositories>
</profile>
<!--开发环境-->
<profile>
<id>env-dev</id>
<repositories>
<repository>
<id>nexus-dev</id>
<url>http://192.168.111.202:7000/nexus/content/groups/public/</url>
</repository>
</repositories>
</profile>
</profiles>


<activeProfiles>
<!--激活测试环境-->
<activeProfile>env-test</activeProfile>
<!--激活开发环境-->
<activeProfile>env-dev</activeProfile>
</activeProfiles>
</settings>

pom.xml参考如下

<distributionManagement>
<repository>
<id>env-dev</id>
<name>Nexuss Releses Repository</name>
<url>
http://192.168.111.203:7000/nexus/content/repositories/releases/
</url>
</repository>
</distributionManagement>

distributionManagement中的repository
表示的是项目打包成库文件后要上传到什么库地址