Java路径冲突本质是PATH中首个java.exe非目标JDK,尤其Oracle javapath等会劫持调用;需删除C:\Program Files\Common Files\Oracle\Java\javapath,PATH仅保留%JAVA_HOME%\bin并置顶;多版本时用JAVA_8_HOME等变量间接引用JAVA_HOME;IDE须手动配置SDK,Gradle需同步org.gradle.java.home;验证前须重启所有终端并检查echo %JAVA_HOME%、java -version、where java、javac -version四者一致。

多个Java路径冲突的本质是系统在PATH里找到了“第一个java.exe”,但它未必是你想用的那个JDK——尤其当Oracle自动安装的javapath、旧版JRE、或IDE自带精简版混在里面时,java -version和javac -version就很容易对不上。
where java 显示 javapath 是最大信号
这是Windows下最典型的路径污染。运行where java,如果第一行输出是C:\Program Files\Common Files\Oracle\Java\javapath\java.exe,那说明你根本没控制权:这个目录下只有几个硬链接(java.exe、javaw.exe、javaws.exe),它会无视JAVA_HOME,只按自己规则转发调用。
- 必须进文件管理器,直接删掉整个
C:\Program Files\Common Files\Oracle\Java\javapath文件夹(不是禁用,是物理删除) - 删完后检查PATH变量,确保里面没有残留的
C:\Program Files (x86)\Java\jre*或E:\some\old\jdk\bin这类硬编码路径 - 只保留一条:
%JAVA_HOME%\bin,且把它拖到PATH列表最顶部
多版本共存时 JAVA_HOME 不能写死
如果你装了OpenJDK 8、17、25,每个都放在独立目录(比如C:\jdk\jdk8、C:\jdk\jdk17、C:\jdk\jdk25),就别把JAVA_HOME直接设成某个固定路径——那样每次切换都要开环境变量面板点半天。
- 新建系统变量:
JAVA_8_HOME=C:\jdk\jdk8,JAVA_17_HOME=C:\jdk\jdk17,JAVA_25_HOME=C:\jdk\jdk25 - 把
JAVA_HOME的值设为%JAVA_25_HOME%(或%JAVA_17_HOME%),这样它就成了一个“指针” - PATH里只留
%JAVA_HOME%\bin,不写任何具体版本路径 - 切换时只需改
JAVA_HOME的值,或用批处理脚本一键替换(比如setx JAVA_HOME "%JAVA_8_HOME%")
IDE不读系统PATH,必须手动指定SDK
IntelliJ、Eclipse、VS Code这些工具启动时,基本不继承你改好的Shell环境变量。它们要么用自带JRE,要么读注册表/配置文件里的旧记录,导致项目能编译但报UnsupportedClassVersionError。
立即学习“Java免费学习笔记(深入)”;
- IntelliJ:File → Project Structure → Project → Project SDK → 点“Add JDK…” → 手动选
C:\jdk\jdk25根目录(不能选bin子目录) - Eclipse:右键项目 → Properties → Java Build Path → Libraries → JRE System Library → Edit → “Workspace default JRE”换成“Alternate JRE”,再从列表选对应版本
- VS Code:Ctrl+Shift+P → 输入“Java: Configure Java Runtime” → 在“Java Configuration Runtimes”里添加JDK路径
- Gradle项目还要检查
gradle.properties里有没有org.gradle.java.home,如果有,值必须和当前JAVA_HOME一致
验证必须关掉所有终端再重开
改完环境变量不关窗口=白改。CMD、PowerShell、IDE内嵌终端、甚至某些Git GUI的shell都缓存着旧PATH。
- 关掉所有已打开的命令行窗口、IDE、Maven/Gradle守护进程(可运行
gradlew --stop) - 新开一个干净CMD,立刻执行三句:
echo %JAVA_HOME%、java -version、where java - 三者必须全部指向同一位置:比如
%JAVA_HOME%输出C:\jdk\jdk25,java -version显示25.0.1,where java第一行是C:\jdk\jdk25\bin\java.exe - 最后补一句
javac -version,确认编译器存在且版本一致——JRE里没有javac,这点最容易被忽略


















