概述

本教程将深入解析 Maven 中快照仓库(Snapshot Repository)与发布仓库(Release Repository)的本质区别,帮助开发者在实际项目中精准使用这两种仓库类型。

Maven 仓库基础

Maven 仓库本质是存储预编译构建产物(通常是 .jar 文件)的集合,供项目作为依赖使用。主要分为两类:

  • 本地仓库:位于开发机上的 $HOME/.m2/repository 目录,Maven 构建时自动创建
  • 远程仓库:外部存储构建产物的服务器(如 Nexus、Artifactory)

当 Maven 解析依赖时:

  1. 优先查询本地仓库
  2. 未找到时,按 settings.xmlpom.xml 中配置的远程仓库顺序查找
  3. 下载后自动缓存到本地仓库

按存储的构建产物类型,远程仓库又可细分为:

  • 快照仓库(存储开发中的不稳定版本)
  • 发布仓库(存储正式发布的稳定版本)

快照仓库详解

快照仓库用于存放增量开发的、未正式发布的构建版本。

核心要点

  • 快照版本是未正式发布的版本标识
  • 允许团队使用固定版本号获取最新开发进度
  • 版本号以 -SNAPSHOT 后缀标识(如 1.0.0-SNAPSHOT

部署构建产物

持续开发中常用快照版本机制。部署时,Maven 会自动将 -SNAPSHOT 替换为带时间戳和构建号的唯一版本:

<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>

配置部署目标仓库(以 Nexus 为例):

<distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus-snapshot</name>
        <url>http://localhost:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

执行 mvn deploy 后,实际部署版本会变成类似 1.0.0-20220709.063105-3 的格式。Maven 自动生成的 maven-metadata.xml 记录了版本映射关系:

<metadata modelVersion="1.1.0">
    <groupId>com.baeldung</groupId>
    <artifactId>maven-snapshot-repository</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <versioning>
        <snapshot>
            <timestamp>20220709.063105</timestamp>
            <buildNumber>3</buildNumber>
        </snapshot>
        <lastUpdated>20220709063105</lastUpdated>
        <snapshotVersions>
            <snapshotVersion>
                <extension>jar</extension>
                <value>1.0.0-20220709.063105-3</value>
                <updated>20220709063105</updated>
            </snapshotVersion>
            <snapshotVersion>
                <extension>pom</extension>
                <value>1.0.0-20220709.063105-3</value>
                <updated>20220709063105</updated>
            </snapshotVersion>
        </snapshotVersions>
    </versioning>
</metadata>

踩坑提示:每次部署相同快照版本都会生成新的时间戳版本号,避免版本冲突。

下载构建产物

使用快照依赖前需配置仓库并启用快照支持:

<repositories>
    <repository>
        <id>nexus</id>
        <name>nexus-snapshot</name>
        <url>http://localhost:8081/repository/maven-snapshots/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>false</enabled>
        </releases>
    </repository>
</repositories>

关键配置

  • <snapshots><enabled>true</enabled></snapshots> 必须显式启用
  • 默认每日检查一次更新,可通过 updatePolicy 调整:
<snapshots>
    <enabled>true</enabled>
    <updatePolicy>always</updatePolicy>
</snapshots>

updatePolicy 支持四种策略:

  • always:每次构建都检查更新
  • daily(默认):每日检查一次
  • interval:XX:按分钟间隔检查
  • never:从不检查

简单粗暴:强制更新所有快照依赖,执行命令时添加 -U 参数:

mvn install -U

引入快照依赖示例:

<dependencies>
    <dependency>
        <groupId>com.baeldung</groupId>
        <artifactId>maven-snapshot-repository</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>

开发阶段优势:团队可固定使用 1.0.0-SNAPSHOT 版本号,自动获取最新开发进度,避免频繁修改版本号。

发布仓库详解

发布仓库存放经过测试的、正式发布的稳定版本构建产物。

核心原则

  • 发布版本的内容不可修改
  • 版号不含 -SNAPSHOT 后缀(如 1.0.0
  • 所有仓库默认启用发布支持

部署构建产物

当项目准备发布时,移除版本中的 -SNAPSHOT 后缀:

<groupId>com.baeldung</groupId>
<artifactId>maven-release-repository</artifactId>
<version>1.0.0</version>

配置发布仓库:

<distributionManagement>
    <repository>
        <id>nexus</id>
        <name>nexus-release</name>
        <url>http://localhost:8081/repository/maven-releases/</url>
    </repository>
</distributionManagement>

关键区别:Maven 会根据版本号自动选择发布仓库(非快照版本)。

重要限制:尝试重复部署相同版本会报错 Repository does not allow updating assets。一旦发布,版本内容不可变更!需发布新版本才能更新。

下载构建产物

配置发布仓库(默认已启用):

<repository>
    <id>nexus</id>
    <name>nexus-release</name>
    <url>http://localhost:8081/repository/maven-releases/</url>
</repository>

引入发布依赖:

<dependencies>
    <dependency>
        <groupId>com.baeldung</groupId>
        <artifactId>maven-release-repository</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

核心特性

  • 仅解析已发布的稳定版本
  • 版本内容保证不可变
  • Maven Central 默认采用发布策略

总结

使用场景对比

仓库类型 适用场景 版本示例 更新机制
快照仓库 开发中/持续集成 1.0.0-SNAPSHOT 时间戳+构建号
发布仓库 生产环境/正式发布 1.0.0 不可变

实践建议

  1. 开发阶段使用快照版本,团队协作效率更高
  2. 发布正式版本时务必切换到发布仓库
  3. 避免在生产环境使用快照依赖(版本不可控)
  4. 严格管理发布仓库的部署权限(防误操作)

源码示例已上传至 GitHub 仓库,欢迎参考实践。


原始标题:Maven Snapshot Repository vs Release Repository