概述
本教程将深入解析 Maven 中快照仓库(Snapshot Repository)与发布仓库(Release Repository)的本质区别,帮助开发者在实际项目中精准使用这两种仓库类型。
Maven 仓库基础
Maven 仓库本质是存储预编译构建产物(通常是 .jar 文件)的集合,供项目作为依赖使用。主要分为两类:
- 本地仓库:位于开发机上的
$HOME/.m2/repository
目录,Maven 构建时自动创建 - 远程仓库:外部存储构建产物的服务器(如 Nexus、Artifactory)
当 Maven 解析依赖时:
- 优先查询本地仓库
- 未找到时,按
settings.xml
或pom.xml
中配置的远程仓库顺序查找 - 下载后自动缓存到本地仓库
按存储的构建产物类型,远程仓库又可细分为:
- 快照仓库(存储开发中的不稳定版本)
- 发布仓库(存储正式发布的稳定版本)
快照仓库详解
快照仓库用于存放增量开发的、未正式发布的构建版本。
核心要点:
- 快照版本是未正式发布的版本标识
- 允许团队使用固定版本号获取最新开发进度
- 版本号以
-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 | 不可变 |
实践建议:
- 开发阶段使用快照版本,团队协作效率更高
- 发布正式版本时务必切换到发布仓库
- 避免在生产环境使用快照依赖(版本不可控)
- 严格管理发布仓库的部署权限(防误操作)
源码示例已上传至 GitHub 仓库,欢迎参考实践。