引言:坐标和依赖是一个构件在Maven世界中逻辑表示方式,而构件的物理表示方式就是文件而已,仓库就是统一管理这些文件的地方。

目录
[TOC]

仓库类别

  • 本地仓库
  • 远程仓库: 中仓仓库(自带的默认远程仓库)、***(一种特殊的远程仓库)、其他

仓库路径与坐标的关系

简而言之,具体的路径根据坐标计算获得;

通过坐标大致对应的仓库路径如下:
groupId/artifactId/version/artifact-version.packaging
注:阅读Maven源码得出。。

本地仓库

位置: 在本地机器当前用户目录下 .m2/repository文件夹中。
注:当用户输入第一条命令后,Maven才会创建本地仓库。每个用户只有一个本地仓库。

***

存在的意义

1.节省外网带宽和减少Maven构建的时间
2.部署第三方构件
3.提高稳定性、增强控制

作用

***所有的外部的远程仓库

中央仓库

安装的Maven自带了中央仓库配置,Maven3中配置位于$M2_HOME/lib/maven-model-builder-3.0.jar里的/org/apache/maven/model/pom-4.0.0.xml的文件中,所有的Maven项目都会继承这个超级POM,配置如下:

<repositories>
    <repository>
        <id>central </id>   <!-- 唯一标识 -->
        <name> Maven Repository Switchboard </name> <!-- 仓库名称 -->
        <url>http://repo1.maven.org/maven2<url><!-- 仓库地址 -->
        <layout>default</layout> <!-- 设置布局 -->
        <snapshots>
            <enabled> false </enabled>  <!-- 能否从仓库下载快照版本的构件 -->
        </snapshorts>
    </repository>
</repositories>

仓库配置

仓库配置、仓库认证配置、仓库镜像配置

关键点: 仓库的ID的指定, 它是多个配置能关联起来的的纽带。

仓库配置: 在项目的pom.xml中配置
仓库认证配置: 在本地Maven的setting.xml中配置
仓库镜像配置:在本地Maven的setting.xml中配置

仓库配置

举个栗子🌰:

<project>
...
<repositories>
    <repository>
        <id>jboss </id>   <!-- 唯一标识 -->
        <name> JBoss Repository </name> <!-- 仓库名称 -->
        <url>http://repository.jobss.com/maven2<url><!-- 仓库地址 -->
        <layout>default</layout> <!-- 设置布局 -->
         <releases>
            <enabled> true </enabled>  <!-- 能否从仓库下载发布版本的构件 -->
        </releases>
        <snapshots>
            <enabled> false </enabled>  <!-- 能否从仓库下载快照版本的构件 -->
            <updatePolicy> daily </updatePolicy><!- 设置从远处仓库检查更新频率,默认值:daily; 可选值:daily,never,always,interval:X -->
            <checksumPolicy> ignore </checksumPolicy><!-- 设置Maven验证 *校验和文件*的策略,默认值:warn; 可选值:warn,fail,ignore (下载构件时,Maven会验证构件的*校验和文件*,若验证失败改如何处理呢?即使用该配置处理) -->
        </snapshorts>
    </repository>
</repositories>
...
</project>

要特别注意:如果仓库的ID命名重复了,新的会覆盖老的仓库配置。

扩展: 可以使用命令行-U参数强制让Maven检查更新,如mvn clean install -U ;Maven就会暂时忽略仓库updatePolicy元素的配置。

仓库认证配置

举个栗子🌰:

<servers>
 <server>
   <id>jboss</id>
   <username>root</username>
   <password>123456</password>
 </server>
</servers>
镜像配置

举个栗子🌰:

<!-- 阿里云镜像 -->
   <mirror>
       <id>nexus-aliyun</id>
       <name>Nexus aliyun</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public</url>
       <mirrorOf>*</mirrorOf>   <!-- 镜像仓库所***仓库的范围,支持指定被镜像的仓库名和排除某些仓库 -->
   </mirror>

啥是镜像仓库? 如果仓库X可以提供仓库Y所存储的所有内容,就可以认为仓库X是Y的一个镜像。

注意: 由于镜像仓库X完全屏蔽了被镜像的仓库Y,因此即使镜像仓库X挂了,你就废了,懂不,这里被镜像的仓库没吊毛关系的。

部署至远程仓库: mvn clean deploy

在需要上传的工程中的pom.xml文件中加入下面的配置

<distributionManagement>
   <repository>  <!-- 发布版本仓库 -->
           <id>release</id>
           <name>Release Repository</name>
           <url>http://ip/nexus/content/repositories/releases</url>
   </repository>
   <snapshotRepository>  <!--快照版本仓库 -->
           <id>snapshot</id>
           <name>Snapshot Repository</name>
           <url>http://ip/nexus/content/repositories/snapshots</url>
   </snapshotRepository>
</distributionManagement>
或者
使用命令行方式
mvn deploy:deploy-file -DgroupId=groupId -DartifactId=artifactId -Dversion=version -Dfile=本地jar包路径 -DrepositoryId=releases/snapshots -Durl=仓库地址

举例:上传jmxri-1.2.1.jar,本地存放在D盘
mvn deploy:deploy-file -DgroupId=com.sun.jmx –DartifactId=jmxri -Dversion=1.2.1 -Dfile=d:/jmxri-1.2.1.jar -DrepositoryId=releases -Durl=http://ip/nexus/content/repositories/releases

规则: 快照版本部署到快照仓库中,其他部署到发布版本仓库中。

解密仓库解析依赖机制

基础概念
  • LATEST版本:最新版本
  • RELEASE版本:最新发布版本

最新的版本号基于元数据:groupId/artifactId/maven-metadata.xml计算出来的。

  • SNAPSHOT版本:最新的快照版本

最新的版本号基于元数据:groupId/artifactId/version/maven-metadata.xml计算出来的。
在解析前,要先通过元数据计算出最新版本号。

解析机制
  1. 当依赖范围是system时,Maven会直接从本地文件系统解析构件。
  2. 构件会先从本地寻找,本地不存在再从远程仓库下载。
  3. 如果最后解析得到的构件版本是时间戳格式的快照,则要先转化为非时间戳格式,如:SNAPSHOT格式,,然后使用非时间戳格式构件。
  4. 当构件的版本不明晰时,如RELEASE、LATEST,SNAPSHOT. Maven采用最新策略,
  1. 先基于更新远程仓库的策略来检查更新,决定更新后,需要检查仓库的元数据。
  2. 读取所有远程仓库的元数据
  3. 然后同本地元数据合并,计算并获得最新的RELEASE、LATEST,SNAPSHOT的值
  4. 基于该值先从本地获取或者从远程仓库下载

中肯建议

  • 不推荐在依赖声明中使用LATEST和RELEASE版本,特别是LATEST版本,存在一定的隐患。
    注:Maven3已不在支持在插件配置中使用LATEST和RELEASE,但如果不设置插件版本,其效果同RELEASE一样,Maven只会解析最近的发布版本构件。

  • 项目不应该依赖于任何组织外部的快照版本依赖。