在Java中如何安装JDK并配置环境变量_Java开发环境安装配置详解

应选Java 17或21(LTS)版本,优先下载Eclipse Temurin或BellSoft Liberica的OpenJDK安装包;Windows选.msi、macOS选.pkg、Linux注意确认JAVA_HOME路径;配置时JAVA_HOME须指向JDK根目录,PATH添加$JAVA_HOME/bin;验证需java -version与javac -version双命令一致;IDE需单独配置SDK。

下载JDK时该选哪个版本和安装包

Java 17(LTS)或 Java 21(LTS)是当前生产推荐版本,避免使用已停止更新的 Java 8 或非 LTS 版本。Oracle JDK 需要账户且商用受限,OpenJDK 是更稳妥的选择——推荐从 Eclipse Temurin 或 BellSoft Liberica 下载。

Windows 用户注意区分:jdk-21_windows-x64_bin.msi(带图形向导,自动注册表)比 jdk-21_windows-x64_bin.zip(需手动解压+配置)更少出错;macOS 用户优先选 .pkg 安装包;Linux 用户若用 aptdnf 安装,可能装到系统默认的 OpenJDK(如 openjdk-17-jdk),

但路径和 JAVA_HOME 指向需额外确认。

配置 JAVA_HOME 和 PATH 的关键步骤

JAVA_HOME 必须指向 JDK 根目录(不是 bin 子目录),例如 Windows 上是 C:\Program Files\Eclipse Adoptium\jdk-21.0.1+12-hotspot,macOS 上常见为 /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home。PATH 中只需追加 %JAVA_HOME%\bin(Windows)或 $JAVA_HOME/bin(macOS/Linux)。

常见错误包括:

  • JAVA_HOME 设成 .../bin,导致 javac 找不到 tools.jar(现代 JDK 已移除该 jar,但构建工具仍会校验路径)
  • PATH 中重复添加 javajavac 的绝对路径,掩盖了 JAVA_HOME 生效逻辑
  • 在 macOS/Linux 的 ~/.zshrc 中写 export JAVA_HOME=/usr/libexec/java_home -v 21 —— 缺少命令替换语法,正确写法是 export JAVA_HOME=$(/usr/libexec/java_home -v 21)

验证是否配置成功不能只靠 java -version

java -version 只检查 JRE 运行时,无法确认 JDK(含编译器)是否就位。必须同时运行:

java -version
javac -version

两者输出版本号一致,才说明 JAVA_HOMEPATH 均生效。若 javac 报 “command not found”,大概率是 PATH 里漏了 $JAVA_HOME/bin;若 javajavac 版本不一致(如 java 是 17、javac 是 21),说明系统存在多个 JDK,且 PATH 中有其他 JDK 的 bin 目录排在前面。

IDE(如 IntelliJ IDEA)通常不依赖系统环境变量,而是自行管理 SDK,所以终端验证通过 ≠ IDE 内能编译。务必在 IDE 的 Project Structure → SDKs 中手动指定同一 JDK 路径。

多 JDK 共存时如何安全切换

开发中常需来回切换 JDK 版本,硬改环境变量太脆弱。推荐方式:

  • Windows:用 setx JAVA_HOME "path" 临时覆盖(仅当前 CMD 窗口),或配合批处理脚本封装常用组合
  • macOS/Linux:在 ~/.zshrc 中定义函数,例如:
    jdk() {
      export JAVA_HOME=$(/usr/libexec/java_home -v "$1")
      export PATH=$JAVA_HOME/bin:$PATH
    }
    # 使用:jdk 21
  • 项目级隔离:Maven 项目可通过 maven-compiler-pluginsource/target 控制字节码级别,但实际编译仍依赖 JAVAC 所在 JDK 版本 —— 所以插件设置 ≠ JDK 切换

真正影响编译结果的是 javac 命令的实际路径,不是 source 参数。这点容易被忽略,尤其在 CI 环境中混用不同 JDK 容易导致 UnsupportedClassVersionError