java env setup
Java & Maven 编译环境维护指南
基于实际踩坑整理,适用于 macOS + 多 JDK 共存场景。
核心概念:三层版本控制
1 | 全局 (Global) ~/.jenv/version ← jenv global <version> |
Maven 读取 Java 版本的路径:
1 | JAVA_HOME 环境变量 → (jenv export 插件同步) → jenv 当前版本 |
关键结论:java 命令和 mvn 使用的 Java 版本,是两个独立的机制,必须都配好才能一致。
一次性环境搭建
1. 安装 jenv
1 | brew install jenv |
在 ~/.zshrc 末尾加入(顺序不能错):
1 | export PATH="$HOME/.jenv/bin:$PATH" |
然后启用两个关键插件:
1 | jenv enable-plugin export # 让 jenv 切版本时同步更新 JAVA_HOME |
重新加载:
1 | source ~/.zshrc |
2. 注册已安装的 JDK
jenv 不会自动扫描系统 JDK,每个都要手动注册:
1 | # 查看系统中已安装的 JDK |
3. 设置全局默认版本
1 | jenv global 17 |
4. 验证 java 和 mvn 一致
1 | java -version # 应该是 17 |
如果 mvn 显示的 Java 版本与 java -version 不一致,说明 export 插件没生效,重新执行:
1 | jenv enable-plugin export |
项目级版本锁定
在项目根目录执行:
1 | cd /path/to/your-project |
效果:进入该目录后,java 和 mvn 自动切换到 17,离开后恢复全局版本。
是否提交 .java-version 到 git?
| 场景 | 建议 |
|---|---|
| 团队统一使用 jenv | git add .java-version,锁定版本,避免环境差异 |
| 团队工具不统一 | 加入 .gitignore,作为个人本地配置 |
本项目选择加入 git,确保所有开发者在项目目录内自动使用 Java 17:
1 | git add .java-version |
常见问题排查
问题 1:jenv global 1.8 执行后版本没变
排查步骤:
1 | # 1. 检查当前目录是否有 .java-version(Local 优先级更高) |
常见原因:
- 当前目录存在
.java-version,Local 覆盖了 Global 1.8版本未通过jenv add注册
问题 2:java -version 是 17,但 mvn --version 显示 Java 8 或 24
根因:JAVA_HOME 环境变量没有跟随 jenv 切换。
1 | echo $JAVA_HOME # 查看当前 JAVA_HOME 指向哪里 |
修复:
1 | jenv enable-plugin export |
问题 3:mvn 报 invalid flag: --release
根因:Maven 用了 Java 8,而 --release 参数是 Java 9+ 才支持的编译器参数。
快速验证:
1 | mvn --version | grep "Java version" |
修复:确保 JAVA_HOME 指向 Java 11+,参考问题 2。
问题 4:新开 terminal 版本恢复默认
根因:~/.zshrc 里没有 jenv 初始化代码,或者初始化代码放在了 ~/.bashrc 里(但用的是 zsh)。
检查:
1 | grep -n "jenv" ~/.zshrc |
确保以下三行在 ~/.zshrc 里:
1 | export PATH="$HOME/.jenv/bin:$PATH" |
版本切换速查
1 | # 查看所有已注册版本 |
本项目的 mvnw 备用方案
项目根目录提供了 mvnw 脚本,不依赖 jenv 或 JAVA_HOME 配置,直接通过 /usr/libexec/java_home -v 17 定位 Java 17:
1 | ./mvnw clean package # 始终使用 Java 17 构建 |
当 jenv 环境出问题时,./mvnw 是最可靠的兜底方案。
环境健康检查清单
每次遇到奇怪的编译问题,先跑这几条:
1 | jenv doctor # jenv 自检 |
正常状态:java -version、mvn --version 中的 Java 版本、$JAVA_HOME 路径三者一致。
