一、maven仓库配置

仓库优先级为:本地仓库(localRepositories) > profile中的repositories仓库 > POM > mirrors全局仓库

1. repositories作用

<repositories>
  <repository>
    <id>aliyun-releases</id>
    <name>阿里云仓库(name可以随便起)</name>
    <url>https://maven.aliyun.com/repository/public</url>
  </repository>
</repositories>
  • 指定搜索远程仓库的地址
  • repositories标签下可以配置多个repository,如果我们配置了多个repository,maven会用哪个呢,答案是按出现顺序使用,如果第1个可用,就用第一个,如果不可用,就依次往下找

上面配置时似乎也没什么用,确实是,如果你只是在pom.xml中配置个仓库,这个id是没什么用的,可以随便写,其实这个id是配合上面讲的mirror一块使用的,还记得mirrorOf吗,我们配置mirrorOf为central是,mirror中的url就是central仓库的url给覆盖了,所以这里的标签下的id是给mirrorOf用的。

1)repositories和mirror关联

可以看下面一个例子,本来我们的abc-releases这个仓库是不可用的,因为根本就没有https://abc.def.com/repository/public/这个仓库,但是我们通过mirror配置,改变了id为abc-releases这个仓库的url,从而使用maven也可以从id为abc-releases这个仓库下载jar包了。当然这样配置也没只啥意义,只是为了方便理解repository和mirror之间的关系。

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

2. mirror作用

  • maven获取真正起作用的repository集合流程:首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素,
  • 如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository,
  • 如果该repository找不到对应的mirror,则使用其本身,依此可以得到最终起作用的repository集合,
  • repositories中默认包含了中央仓库central,当然也可以重新它的url;
    可以理解mirror是复写了对应id的repository

mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
没有配置mirror:

配置mirror:

A 此时,B Repository被称为A Repository的镜像。
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件

settings 文件介绍

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository -->
    <!--本地仓库-->
  <localRepository>D:\Maven\repository</localRepository>

  <mirrors>
    <mirror>
      <id>mirrorId</id>
      <!--重定向repository中id对应的地址-->
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
  </mirrors>

  <profiles>
     <profile>
      <id>default_profile</id>
      <repositories>
        <!--包含需要连接到远程仓库的信息 -->
        <repository>
          <!--远程仓库唯一标识 -->
          <id>public</id>
          <!--远程仓库名称 -->
          <name>自定义名称</name>
          <!--远程仓库URL,按protocol://hostname/path形式-->
          <url>https://maven.aliyun.com/repository/public</url>
          <!--如何处理远程仓库里发布版本的下载 -->
          <releases>
            <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
            <enabled>true</enabled>
            <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
            <updatePolicy>never</updatePolicy>
            <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
          <snapshots>
            <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
            <enabled>true</enabled>
            <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
            <updatePolicy>always</updatePolicy>
            <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
            <checksumPolicy>warn</checksumPolicy>
          </snapshots>
          <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
          <layout>default</layout>
        </repository>
      </repositories>
    </profile>
    
	<profile>
      <id>ali_profile</id>
	 <repositories>
	      <repository>
			<id>public</id>
			<url>https://maven.aliyun.com/repository/public</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
        <repository>
			<id>spring</id>
			<url>https://maven.aliyun.com/repository/spring</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-plugin</id>
			<url>https://maven.aliyun.com/repository/spring-plugin</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>google</id>
			<url>https://maven.aliyun.com/repository/google</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>gradle-plugin</id>
			<url>https://maven.aliyun.com/repository/gradle-plugin</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>

		<repository>
			<id>grails-core</id>
			<url>https://maven.aliyun.com/repository/grails-core</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>apache snapshots</id>
			<url>https://maven.aliyun.com/repository/apache-snapshots</url>
			<releases>
			<enabled>true</enabled>
			</releases>
			<snapshots>
			<enabled>true</enabled>
			</snapshots>
		</repository>
      </repositories>
	</profile>
  </profiles>
  
  <activeProfiles>
  <!--激活的prifile配置文件id-->
    <activeProfile>default_profile</activeProfile>
  </activeProfiles>
</settings>