Java项目编译或运行失败常因JDK版本不匹配;需先检查java/javac版本及JAVA_HOME,再按作用范围选择临时(export)或永久(修改shell配置)切换方式,并注意IDE、构建工具及update-alternatives的单独配置。

Java 项目编译或运行失败,常是因为 javac 或 java 命令调用的不是你期望的 JDK 版本。切换默认 JDK 不是改一个配置就能全局生效的事,得看你是想改当前终端、当前用户,还是影响整个系统——每种方式作用范围和持久性都不同。
检查当前 JDK 版本和路径
先确认现状,避免盲目操作:
java -version javac -version which java which javac echo $JAVA_HOME
注意:java -version 和 javac -version 可能不一致(比如 PATH 里 java 来自 JRE,javac 来自另一个 JDK),$JAVA_HOME 未必被 shell 自动用于定位 java 命令——它只在你显式使用 $JAVA_HOME/bin/java 或某些构建工具(如 Maven)中才起作用。
临时切换:只对当前终端会话有效
适合快速验证某版本是否兼容,或调试构建问题:
立即学习“Java免费学习笔记(深入)”;
- 执行
export JAVA_HOME=/path/to/jdk-17(替换成你本地真实路径,如/usr/lib/jvm/jdk-17.0.1) - 再执行
export PATH=$JAVA_HOME/bin:$PATH——这步必须做,否则java和javac还是旧版本 - 验证:
java -version应输出 17.x,echo $JAVA_HOME应显示新路径
关掉终端就失效,不影响其他窗口或系统级设置。
永久切换:修改用户级 shell 配置文件
推荐方式,影响所有新打开的终端(非已运行的):
- 编辑
~/.bashrc(Linux/macOS Bash)、~/.zshrc(macOS Catalina+ 默认)或~/.profile - 添加两行(路径按你实际安装位置替换):
export JAVA_HOME=/usr/lib/jvm/jdk-11.0.20 export PATH=$JAVA_HOME/bin:$PATH
- 执行
source ~/.bashrc(或对应文件)立即生效
注意:不要把 JAVA_HOME 指向 JRE 目录(如 jre-11.0.20),否则 javac 会报错“command not found”;也不要写成 /usr/lib/jvm/java-11-openjdk-amd64 这类符号链接路径(部分 OpenJDK 包管理器会更新它指向新版本,导致意外回滚)。
IDE 和构建工具需单独配置
即使终端里 java -version 正确,IntelliJ / Eclipse / VS Code 的 Java 插件、Maven、Gradle 仍可能用自己缓存的 JDK 或系统默认值:
- IntelliJ:File → Project Structure → Project Settings → Project → Project SDK
- Maven:检查
pom.xml中maven-compiler-plugin的和,它们只控制字节码版本,不改变javac执行路径 - Gradle:在
gradle.properties中设org.gradle.java.home=/path/to/jdk-17,或通过JAVA_HOME环境变量启动 Gradle
最易忽略的是:某些 Linux 发行版(如 Ubuntu)用 update-alternatives 管理多版本 JDK,此时还需运行 sudo update-alternatives --config java 和 --config javac 同步系统级软链接——否则 sudo 下执行的命令(如 sudo ./gradlew)可能走另一套路径。










