maven通过版本号是否以-snapshot结尾自动区分snapshot与release:1.2.3-snapshot推送到快照仓库并允许覆盖,1.2.3推送到发布仓库且禁止覆盖;依赖拉取时snapshot自动更新,release本地缓存后不再检查远程。

Java 项目中用 Maven 管理 snapshot 和 release 版本,核心不是靠插件或命令硬编码,而是靠 版本号命名规则 自动触发整套行为。只要写对 version,Maven 就能自动区分用途、路由仓库、控制依赖更新策略。
版本号是唯一开关
Maven 全程只看 <version></version> 是否以 -SNAPSHOT(全大写、连字符开头)结尾:
-
快照版:如
1.2.3-SNAPSHOT→ Maven 认定为开发中版本,允许重复发布、强制拉取最新构建 -
正式版:如
1.2.3或1.2.3-RELEASE→ Maven 视为稳定不可变版本,禁止覆盖上传,本地缓存后默认不再检查远程
注意:-RELEASE 后缀虽被识别为正式版,但属于冗余写法,标准做法就是直接用 1.2.3。
发布时自动路由到对应仓库
执行 mvn deploy 时,Maven 不需要你手动指定推哪边——它根据 version 自动匹配 <distrubutionmanagement></distrubutionmanagement> 中的配置:
- 遇到
-SNAPSHOT→ 找<snapshotrepository></snapshotrepository>,上传到 Nexus 的libs-snapshots-local仓,文件名追加时间戳(如demo-1.2.3-20260813.094522-7.jar) - 遇到纯数字版本 → 找
<repository></repository>,上传到libs-releases-local仓,同版本只允许上传一次,失败即终止
若配置缺失或 ID 不匹配,deploy 会报错,不会“默认 fallback”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
依赖拉取行为完全不同
下游项目引用时,version 写法直接影响构建结果是否随上游变化:
- 写
<version>1.2.3-SNAPSHOT</version>→ 每次mvn compile都检查远程maven-metadata.xml,自动下载最新快照(除非显式禁用) - 写
<version>1.2.3</version>→ 只在本地缺包时拉一次,后续构建完全复用本地~/.m2/repository中的副本
快照依赖适合模块联调;正式版依赖才可用于测试环境和生产部署。
用 release 插件标准化发版流程
手工改 pom、打 tag、deploy 容易出错。推荐用 maven-release-plugin(3.0.0+)自动化:
-
mvn release:prepare:校验工作区干净、无 SNAPSHOT 依赖、测试通过;交互确认三个版本(当前 release 版、tag 名、下一个 SNAPSHOT 开发版);自动提交 pom 更新 + 创建并推送 Git tag -
mvn release:perform:基于刚打的 tag 拉新代码、独立构建、运行完整生命周期(compile/test/package/deploy),确保发布包与 tag 严格一致
插件要求 <distributionmanagement></distributionmanagement> 已正确定义 release/snapshot 仓库,且本地 Git 已配置好远程地址和凭据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










