必须先设JAVA_HOME,再将其bin目录追加到PATH;顺序错误会导致java与javac版本不一致或命令不可用,且IDE配置不影响终端环境变量。

Java的JAVA_HOME和系统PATH谁该优先?
必须先设JAVA_HOME,再把%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux/macOS)追加进PATH。顺序错了会导致java命令调用到旧版本或JRE自带的java.exe,而非你期望的JDK。
常见错误现象:java -version显示的是JRE 1.8,但javac -version报“不是内部或外部命令”——说明PATH里只加了JRE的bin,没指向JDK完整路径。
-
JAVA_HOME必须指向JDK根目录(如C:\Program Files\Java\jdk-17.0.2),不能是...\jdk-17.0.2\bin - Windows下
PATH中不要用双引号包裹路径,除非路径含空格且未正确转义;但更稳妥的做法是改用无空格路径(如C:\jdk17) - Linux/macOS注意
export JAVA_HOME和export PATH=$JAVA_HOME/bin:$PATH要写在~/.bashrc或~/.zshrc末尾,并执行source ~/.zshrc生效
多个JDK共存时如何避免java和javac版本不一致?
根本原因是PATH里存在多个bin目录(比如同时有C:\jdk8\bin和C:\jdk17\bin),而系统按PATH顺序匹配第一个找到的java.exe或javac.exe。但Windows下java.exe可能被重定向到javaw.exe或注册表策略覆盖,导致行为不一致。
- 用
where java(Windows)或which java(Linux/macOS)确认实际调用路径 - 用
java -XshowSettings:properties -version 2>&1 | findstr "java.home"(Windows)或java -XshowSettings:properties -version 2>&1 | grep "java.home"(macOS/Linux)查看JVM真正加载的java.home - 删除
PATH中所有其他JDK的bin路径,只保留当前主用JDK的$JAVA_HOME/bin
IDE(如IntelliJ/VS Code)里配置了JDK,为什么终端mvn compile还是报错?
IDE的JDK配置只影响其内部编译器和运行环境,不影响系统Shell进程的环境变量。Maven、Gradle等构建工具完全依赖终端继承的PATH和JAVA_HOME来定位java和javac。
立即学习“Java免费学习笔记(深入)”;
典型错误信息:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile + java.lang.UnsupportedClassVersionError——说明Maven调用了低版本JDK编译,或source/target与实际JDK不匹配。
- 检查
mvn -v输出中的Java version和JAVA_HOME路径是否与预期一致 - Maven本身不读
JAVA_HOME,但会通过PATH找java,再由java反查java.home;所以JAVA_HOME设错,mvn可能仍能跑,但编译目标版本会出问题 - 如果用SDKMAN!(Linux/macOS),确保
sdk use java 17.0.2-tem后,再开新终端运行mvn,否则旧shell进程不会自动更新PATH
Windows上CMD和PowerShell的PATH行为差异
PowerShell默认不继承CMD的环境变量修改,且对$env:PATH的拼接语法更严格:用+=会覆盖原值,必须用=显式拼接。而CMD的set PATH=%PATH%;...是安全的追加。
常见错误:$env:PATH += ";C:\jdk17\bin" —— 这会在末尾加一个分号,导致Windows解析出空路径,触发“找不到指定路径”错误。
- PowerShell正确写法:
$env:PATH = "C:\jdk17\bin;" + $env:PATH
- CMD正确写法:
set PATH=C:\jdk17\bin;%PATH%
- 修改后务必新开终端验证,旧终端的环境变量不会自动刷新
JAVA_HOME、PATH、IDE设置、构建工具启动脚本、甚至Windows注册表里的JavaSoft项都可能交叉干扰——最稳妥的方式是每次只改一处,然后用where java和java -XshowSettings:properties -version双重验证真实生效路径。










