一、背景:为什么需要一套 Maven 管理方案?
在日常开发中,Maven 经常会遇到这些真实而棘手的问题:
- 不同项目依赖 不同 Maven 版本
- 本地 / 测试 / 生产 使用 不同私服 settings.xml
- Maven 是通过 解压包安装,而不是 brew
- 手动改
PATH、改settings.xml,容易出错且不可回滚 - 多终端并行开发时,环境切换混乱
传统做法通常是:
- 手动改
.zshrc - 手动指定
mvn -s xxx/settings.xml - 或者干脆复制多份 Maven
👉 不优雅,也不工程化
二、设计目标
本文实现一套 zsh-only 的 Maven 管理方案,目标是:
- 像 nvm 一样管理 Maven 多版本
- 自动识别解压安装的 Maven
- 自动扫描 settings.xml 并生成切换命令
- 一次配置,长期使用
- 不依赖 brew,不污染系统环境
三、推荐的目录规范(非常重要)
为了让脚本具备"可预测性",建议 Maven 解压目录和 settings 文件遵循如下规范:
text
~/apache-maven-3.9.9
~/apache-maven-3.8.8
~/.m2/settings.xml
~/.m2/settings-dev.xml
~/.m2/settings-test.xml
~/.m2/settings-prod.xml
👉 只要遵循这个约定,脚本即可自动工作
四、核心能力一:Maven 多版本管理(像 nvm)
1️⃣ 查看本地 Maven 版本
bash
mvn-list
输出示例:
text
3.8.8
3.9.9
2️⃣ 切换 Maven 版本
bash
mvn-use 3.9.9
切换内容包括:
MAVEN_HOMEPATH- 当前终端生效,不影响其他窗口
效果验证:
bash
mvn -v
五、核心能力二:settings.xml 自动扫描与切换
1️⃣ 自动扫描 settings 文件
脚本会在 shell 启动时自动扫描:
text
~/.m2/settings*.xml
并自动生成命令:
bash
mvn-default
mvn-dev
mvn-test
mvn-prod
2️⃣ 一键切换 settings
bash
mvn-dev
等价于:
bash
mvn -s ~/.m2/settings-dev.xml
但优势在于:
- 不需要每次手写
-s - 不修改全局文件
- 不影响其他终端
六、实现原理解析(工程视角)
1️⃣ Maven 版本切换原理
bash
export MAVEN_HOME=~/apache-maven-3.9.9
export PATH=$MAVEN_HOME/bin:$PATH
每次切换只影响当前 shell,安全、可控。
2️⃣ settings 切换原理
bash
alias mvn="mvn -s settings-dev.xml"
通过 alias 劫持 mvn 命令,实现 "无侵入式切换"。
3️⃣ 自动扫描实现思路
- 扫描
settings*.xml - 根据文件名自动生成
mvn-xxx命令 - 新增 / 删除 settings 文件无需改脚本
七、完整脚本说明(一次配置)
该脚本会:
- 将 Maven 管理逻辑写入
~/.zshrc - 自动加载
- 支持后续扩展(版本默认记忆、CI 支持等)
👉 实际脚本较长,建议放在 GitHub / Gist,并在博客中引用
👉 核心思想比代码本身更重要
八、适合哪些人使用?
这套方案特别适合:
- 使用 解压版 Maven 的开发者
- 多项目 / 多私服 / 多环境开发
- 不希望依赖 brew
- 对环境可控性要求高的工程师
- Java / 后端 / CI 构建相关人员
九、总结
通过一套 zsh-only Maven 管理脚本,我们实现了:
- ✅ Maven 多版本切换
- ✅ settings.xml 自动扫描与切换
- ✅ 解压安装友好
- ✅ 零侵入、低心智负担
- ✅ 可长期演进
环境管理做得好,构建问题至少少一半。
十、后续可扩展方向
- Maven 版本默认记忆
- settings profile 自动提示
- CI / Docker 专用 settings 生成
- 类似 nvm 的统一 Maven 管理器