背景

在日常开发中,我们经常会在不同的项目中使用不同的 Maven 配置,例如:

  • 公司项目需要使用公司的私服(如 Nexus)
  • 个人项目需要使用默认或自定义的个人仓库

为了避免频繁手动切换 settings.xml,可以利用 Shell 自动判断当前工作目录 并自动为 mvn 命令应用对应的 settings.xml

本文记录一种简单实用的方案:根据目录前缀自动设置 Maven 的 alias,实现 Maven 配置的自动切换。


🎯 目标

  • /Users/userName/data/work/** → 自动使用 ~/.m2/settings-work.xml
  • /Users/userName/data/personal/** → 自动使用 ~/.m2/settings.xml
  • 不污染全局配置
  • 不需要手动输入 mvn -s xxx

🧩 基础方案:根据目录设置 alias

将以下内容添加到 ~/.zshrc~/.bashrc

1
2
3
4
5
6
7
8
9
# Maven for company projects
if [[ $PWD == /Users/userName/data/work/** ]]; then
alias mvn='mvn -s ~/.m2/settings-work.xml'
fi

# Maven for personal projects
if [[ $PWD == /Users/userName/data/personal/** ]]; then
alias mvn='mvn -s ~/.m2/settings.xml'
fi

📌 注意事项

1. Shell 启动时

$PWD

只代表“启动时的目录”

上述方案只在 打开终端时 生效,之后 cd 切换目录不会重新更新 alias。

例如:

1
2
终端打开在 /work → 使用 settings-work.xml
cd ~/data/personal → mvn 仍然是 work 的 settings

若你经常“在目录中打开终端”,则简单方案即可满足需求。


2. alias 会覆盖系统 mvn

如果某些脚本需要原始 mvn,可使用:

1
2
3
\mvn clean install
# 或
command mvn clean install

3. bash 用户注意 glob 语法

bash 需要开启:

1
shopt -s extglob

否则 path/** 匹配无效。


✔️ 推荐方案:zsh 自动切换(支持 cd 后自动更新)

如果你使用 zsh,这个方案更智能。

利用 chpwd 钩子,每次 cd 时自动更新 mvn alias。

将以下内容加入 ~/.zshrc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function update_mvn_alias() {
if [[ $PWD == /Users/userName/data/work/** ]]; then
alias mvn='mvn -s ~/.m2/settings-work.xml'
elif [[ $PWD == /Users/userName/data/personal/** ]]; then
alias mvn='mvn -s ~/.m2/settings.xml'
else
# 离开项目目录恢复默认 mvn
unalias mvn 2>/dev/null
fi
}

# 每次 cd 都触发
chpwd_functions+=(update_mvn_alias)

# 终端启动时执行一次
update_mvn_alias

推荐方案优点

  • 自动切换,无需重新打开终端
  • 离开对应目录自动恢复默认 mvn
  • 支持多个规则扩展
  • 不影响全局 mvn 使用

🧷 Maven settings 示例(可选)

公司配置示例:

1
2
3
4
5
6
7
8
9
<settings>
<mirrors>
<mirror>
<id>company-nexus</id>
<url>https://nexus.company.com/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>

个人配置示例:

1
2
3
4
5
6
7
8
9
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>

📚 总结

通过目录自动切换 Maven settings,你可以:

  • 隔离公司/个人的构建环境
  • 避免 settings 配置冲突
  • 获得更方便、更自动化的开发体验