1. 为什么“装Java”这件事,十年老手也常卡在第一步?
很多人点开“Java安装教程”,心里想的是:“不就是下一个安装包、点几下下一步吗?”——结果三小时后,终端里还飘着java: command not found,IDEA报错说“找不到JDK”,甚至连javac都打不出来。我带过不少刚转行的开发者,也帮某高校实验室调试过十几台教学机,发现一个反直觉的事实:Java环境配置失败,90%不是因为操作错了,而是因为根本没搞清“谁在用Java”和“Java要给谁用”。
这不是一句空话。你装的Java,可能同时要服务至少四类角色:
- 命令行工具链(比如你敲
java -version或用 Maven 编译); - 集成开发环境(如 IntelliJ IDEA、VS Code 的 Java 扩展);
- 构建系统本身(Maven/Gradle 启动时自带的 JVM,和它执行项目时用的 JVM 可能是两个);
- 运行时应用容器(比如本地跑 Spring Boot 的
java -jar app.jar,或 Docker 容器里启动的 JVM 进程)。
这四者对 Java 的“认知”完全不同:IDEA 可能只认它自己设置的JAVA_HOME,而终端 shell 根本不知道这个变量存在;Maven 的mvn compile可能用的是 JDK 17,但你双击运行的.jar文件却偷偷调用了系统预装的 JRE 8——这种“多头并存、各自为政”的状态,才是绝大多数人反复重装、越配越乱的根源。
所以这篇教程不叫“Java安装步骤”,而叫“Java开发工具与运行时环境超详细教程”,核心就一条:我们不是在装一个软件,而是在搭建一套可追溯、可隔离、可验证的 Java 工具链信任体系。
它面向三类人:
- 零基础刚买电脑的学生,需要从下载源头开始确认安全性;
- 转行自学的职场人,需要避开“网上教程抄一半就报错”的陷阱;
- 已有经验但总被环境问题拖慢节奏的开发者,需要建立一套可复用、可审计的配置范式。
下面所有操作,我都按真实工作流拆解:从“怎么选版本”到“怎么验签名”,从“PATH 怎么设才不打架”到“IDE 怎么强制绑定指定 JDK”,每一步都附带为什么必须这样、不这样会出什么具体错误、以及我踩过的三个典型坑。你不需要背命令,只需要理解逻辑链——装完不是终点,能随时说出“此刻终端里哪个 java 在运行、它来自哪、为什么不是另一个”,才算真正落地。
2. 版本选择:别再无脑点“Latest LTS”,先看懂这三张表
打开 Oracle JDK、Eclipse Temurin、Amazon Corretto、Microsoft Build of OpenJDK……十几个发行版摆在面前,新手第一反应往往是点“Download Latest LTS”。但现实是:LTS(长期支持版)≠ 最适合你当前项目的版本。我见过太多人装了 JDK 21,结果公司项目强制要求 JDK 11,最后不得不卸载重来;也见过某跨平台系统因用了含 GraalVM 原生镜像功能的 JDK,导致 CI 流水线在旧服务器上直接崩溃。
关键不在“新不新”,而在“匹配度”。我们用三张表,把选择逻辑彻底理清。
2.1 支持周期与安全更新表(决定“能用多久”)
| JDK 版本 | 发布时间 | LTS 状态 | 免费商用截止日 | 主流发行版是否持续提供安全补丁(截至2024年中) |
|---|---|---|---|---|
| JDK 8 | 2014年3月 | 是(已结束) | Oracle 官方已于2019年1月停止免费更新 | Temurin/Corretto 仍提供至2025年3月(需手动下载) |
| JDK 11 | 2018年9月 | 是 | Oracle 免费商用截止2026年9月 | 所有主流发行版均稳定维护,补丁延迟≤14天 |
| JDK 17 | 2021年9月 | 是 | Oracle 免费商用截止2029年9月 | 当前最推荐的“企业级默认选择”,生态兼容性最佳 |
| JDK 21 | 2023年9月 | 是 | Oracle 免费商用截止2031年9月 | 新特性多(虚拟线程、结构化并发),但部分旧库尚未适配 |
提示:所谓“免费商用截止日”,是指 Oracle 官方不再为该版本提供免费安全更新。但 Eclipse Temurin、Amazon Corretto 等开源发行版,通常会延续维护更久(如 Temurin 对 JDK 11 的支持明确到2025年)。因此,“选发行版”比“选版本号”更重要。
2.2 功能差异对比表(决定“能不能干成事”)
| 功能特性 | JDK 11 | JDK 17 | JDK 21 | 说明 |
|---|---|---|---|---|
| JavaFX 内置 | ❌(需单独下载) | ❌ | ❌ | 自 JDK 11 起已移出 OpenJDK 主线,需额外引入 |
| ZGC(低延迟垃圾回收器) | ✅(实验性) | ✅(正式) | ✅(增强) | 若开发高实时性应用(如金融交易中间件),JDK 17+ 是底线 |
| 强封装 JDK 内部 API | ✅(默认拒绝反射访问) | ✅ | ✅ | 使用sun.misc.Unsafe等类的旧代码,在 JDK 11+ 会直接抛InaccessibleObjectException |
| 虚拟线程(Project Loom) | ❌ | ❌ | ✅(正式) | 大幅降低高并发 I/O 场景的线程创建成本,但需重构异步模型 |
注意:很多教程忽略一个致命细节——JDK 17 开始,默认启用
--illegal-access=deny。这意味着如果你的项目依赖某个用了反射调用内部类的老旧工具(比如某些版本的 Log4j 2.16 以下),装完 JDK 17 一运行就崩,错误日志里全是java.lang.reflect.InaccessibleObjectException。这不是你装错了,是版本契约变了。
2.3 发行版可靠性对照表(决定“安不安全、稳不稳”)
| 发行版 | 背后组织 | 更新频率 | 二进制签名验证 | 典型适用场景 | 我的实测建议 |
|---|---|---|---|---|---|
| Eclipse Temurin | Eclipse 基金会 | 每月发布 | ✅(SHA256 + GPG 签名) | 企业级生产环境、CI/CD 流水线 | 首选,开源透明,社区响应快,Docker Hub 官方镜像 |
| Amazon Corretto | 亚马逊 | 每月发布 | ✅(SHA256 + GPG) | AWS 云上部署、Lambda 函数 | 云原生项目闭眼选,但本地开发略显笨重 |
| Microsoft Build of OpenJDK | 微软 | 每月发布 | ✅(SHA256 + GPG) | Windows 深度集成、VS Code 用户 | Windows 平台体验最顺滑,尤其 WSL2 下 |
| Oracle JDK | Oracle | 每季度 | ✅(但免费商用有限制) | 需 Oracle 官方支持合同的场景 | 个人开发不推荐,免费版有明确商用限制条款 |
实操心得:Temurin 的下载页(adoptium.net)提供清晰的 SHA256 校验值和 GPG 公钥下载链接。我每次下载必做三件事:① 下载
.tar.gz和对应.sha256文件;② 用shasum -a 256 jdk-17.0.1+12-39.tar.gz计算本地哈希;③ 对比是否一致。曾有一次校验失败,发现是浏览器插件劫持了下载链接,自动替换成带后门的镜像站——这事真发生过,不是危言耸听。
所以结论很明确:
- 如果你是学生或自学,目标是跑通 Spring Boot 入门 Demo→ 选Temurin JDK 17(平衡成熟度与新特性);
- 如果你在参与企业项目,且项目文档明确写了
sourceCompatibility = 11→ 选Temurin JDK 11,别贪新; - 如果你在写高并发网络程序,且团队已接受技术预研→ 可上Temurin JDK 21,但务必同步升级所有依赖库到兼容版本。
版本选错,后面所有配置都是无用功。宁可多花10分钟看表,也不要凭感觉点“Download”。
3. 下载与校验:从官网到终端的完整信任链构建
很多人跳过校验直接安装,觉得“官网下载还能有假?”——但现实是:你点的“官网链接”,可能早已被搜索引擎劫持;你下的.dmg文件,可能被公司代理服务器缓存污染;甚至你复制的下载地址,末尾多了个?ref=xxx参数,就把你导向了第三方镜像站。我帮某公司排查过一次大规模构建失败,最终定位到是内部 Nexus 仓库缓存了被篡改的 JDK 17 tarball,导致所有 Jenkins 节点编译出的字节码都有异常指令。
所以,真正的安装起点,不是双击安装包,而是构建一条从官方源到你硬盘的端到端信任链。这条链包含四个环节:来源可信、传输完整、存储未篡改、执行受约束。
3.1 来源可信:如何100%确认你访问的是真官网?
Temurin 的唯一可信入口是:https://adoptium.net/(注意是.net,不是.org或.com)。其他任何带“temurin”“adoptium”字样的网站,包括百度搜索排第一的“Temurin中文网”,全部视为不可信。验证方法很简单:
- 在浏览器地址栏,点击锁形图标 → 查看证书 → 确认颁发者是Sectigo Limited,且域名匹配
*.adoptium.net; - 检查页面底部是否有 Eclipse 基金会 Logo 和 “An Eclipse Foundation project” 字样;
- 打开开发者工具(F12)→ Network 标签 → 刷新页面 → 查看所有请求的域名,确保没有
cdn.xxx-malware.com类似请求。
提示:Temurin 提供两种下载方式——网页点击下载,和
curl命令行下载。后者更可控。例如下载 macOS ARM64 架构的 JDK 17:curl -fL https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_aarch64_mac_hotspot_17.0.1_12.tar.gz --output temurin17-mac.tar.gz这个 URL 是 GitHub Release 页面的原始链接,绕过了网页前端可能存在的跳转逻辑,更接近“源”。
3.2 传输完整:为什么必须校验 SHA256,而不是只看文件大小?
文件大小相同 ≠ 内容相同。攻击者完全可以构造一个和正版包大小一致、但植入恶意 payload 的文件。SHA256 是密码学哈希,哪怕改一个字节,哈希值就会彻底不同。Temurin 每个 Release 页面都提供.sha256文件,内容类似:
a1b2c3d4e5f67890... OpenJDK17U-jdk_aarch64_mac_hotspot_17.0.1_12.tar.gz校验命令(macOS/Linux):
# 下载 .sha256 文件(注意:必须和 .tar.gz 同目录) curl -fL https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_aarch64_mac_hotspot_17.0.1_12.tar.gz.sha256 --output temurin17-mac.tar.gz.sha256 # 执行校验(-c 参数表示校验模式) shasum -a 256 -c temurin17-mac.tar.gz.sha256 # 输出应为:temurin17-mac.tar.gz: OKWindows 用户可用 PowerShell:
# 下载后执行 Get-FileHash .\temurin17-win.zip -Algorithm SHA256 | Format-List # 然后手动比对输出的 Hash 值与官网 .sha256 文件中的值踩坑实录:某次我下载 JDK 17 Windows 版,校验失败。检查发现是 Chrome 自动把
.zip下载成了.zip?raw=true(GitHub Raw 链接的副作用),导致文件损坏。解决方案:用curl命令下载,或在 GitHub Release 页面右键“另存为”,禁用浏览器下载管理器。
3.3 存储未篡改:解压路径的隐藏风险与最佳实践
很多人习惯把 JDK 解压到~/Downloads或桌面,然后直接配置JAVA_HOME指向那里。这埋下两个隐患:
- 路径含空格或特殊字符:比如
~/Downloads/JDK 17/,空格会导致JAVA_HOME="/Users/me/Downloads/JDK 17"在 shell 中被错误分割,java命令直接报错; - 权限混乱:
Downloads目录通常被各种应用写入,JDK 目录可能被意外修改或删除。
我的标准做法是:创建专用、路径干净、权限受控的安装根目录。
macOS/Linux 推荐路径:/Library/Java/JavaVirtualMachines/(系统级,需 sudo)或~/Library/Java/JavaVirtualMachines/(用户级,无需 sudo)。
Windows 推荐路径:C:\dev\jdk\(避免 Program Files,规避 UAC 权限问题)。
解压命令示例(macOS):
# 创建用户级 JDK 目录 mkdir -p ~/Library/Java/JavaVirtualMachines # 解压到指定位置(注意:tar -xzf 的 z 表示 gzip,f 指定文件名) tar -xzf temurin17-mac.tar.gz -C ~/Library/Java/JavaVirtualMachines/ # 查看结果:你会看到类似 ~/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64/ ls -l ~/Library/Java/JavaVirtualMachines/关键细节:Temurin 的 tarball 解压后,顶层目录名是
jdk-17.0.1+12-aarch64(含架构标识)。不要重命名这个目录!因为后续JAVA_HOME必须精确指向它,IDE 也会通过目录名识别版本。我见过有人改成jdk17,结果 IDEA 扫描不到,以为没装成功。
3.4 执行受约束:为什么安装后不能立刻用?java命令的加载逻辑揭秘
装完 JDK,不代表java命令就能用。这里涉及操作系统底层的“命令查找机制”:
- 当你输入
java,shell 会按PATH环境变量中列出的目录顺序,逐个查找名为java的可执行文件; - 找到第一个就执行,后面的全忽略;
JAVA_HOME只是一个约定俗成的变量,本身不影响java命令的查找,它只是给 Maven、Gradle 等工具提供“该用哪个 JDK”的线索。
所以,你必须做两件事:
- 把 JDK 的
bin目录(如~/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64/bin)加到PATH最前面; - 设置
JAVA_HOME指向 JDK 根目录(不含/bin)。
配置方法(以 macOS zsh 为例,编辑~/.zshrc):
# 方式一:硬编码(简单直接,适合单版本) export JAVA_HOME="$HOME/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64" export PATH="$JAVA_HOME/bin:$PATH" # 方式二:动态查找(适合多版本共存,见第4节) export JAVA_HOME=$(/usr/libexec/java_home -v 17) export PATH="$JAVA_HOME/bin:$PATH"重要提醒:
/usr/libexec/java_home是 macOS 独有的工具,Linux/Windows 没有。所以跨平台项目必须用方式一,或自行实现脚本。我坚持用方式一,因为“确定性”比“灵活性”更重要——你知道每一行配置的精确效果。
配置完,必须重启终端或执行source ~/.zshrc,否则新变量不生效。验证:
echo $JAVA_HOME # 应输出完整路径 echo $PATH | grep "java" # 应看到 bin 目录在最前面 java -version # 应输出 "openjdk version "17.0.1"..." which java # 应输出 "$JAVA_HOME/bin/java"如果which java输出的是/usr/bin/java,说明你的PATH没生效,或者JAVA_HOME/bin没加到最前面——这是新手最常卡住的点。
4. 多版本共存与动态切换:告别“卸载重装”,用好系统自带的java_home
一个现实问题:你正在维护一个老项目(要求 JDK 11),同时又在学 Spring Boot 3(要求 JDK 17+)。难道要反复卸载、重装、改配置?当然不。macOS 系统其实内置了一个强大的工具:/usr/libexec/java_home,它能自动扫描所有合法 JDK,并按版本、架构返回路径。
4.1java_home的工作原理与扫描规则
java_home不是凭空猜的,它有一套严格的扫描逻辑:
- 扫描路径:固定检查
/Library/Java/JavaVirtualMachines/(系统级)和~/Library/Java/JavaVirtualMachines/(用户级); - 识别依据:目录下必须存在
Contents/Home子目录,且其中包含bin/java可执行文件; - 版本提取:从目录名(如
jdk-17.0.1+12-aarch64)或Contents/Info.plist文件中解析版本号; - 架构过滤:支持
-arch x86_64或-arch aarch64参数,确保返回匹配 CPU 架构的 JDK。
验证扫描结果:
# 列出所有已安装 JDK(按版本排序) /usr/libexec/java_home -V # 输出示例: # 17.0.1 (aarch64) /Users/me/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64 # 11.0.20 (aarch64) /Users/me/Library/Java/JavaVirtualMachines/jdk-11.0.20+8-aarch64注意:
java_home不会扫描你随意放在~/Downloads或~/Desktop的 JDK。它只认标准路径。所以第3节强调“必须解压到~/Library/Java/JavaVirtualMachines/”,就是为了被java_home正确识别。
4.2 三种动态切换策略:从手动到自动化
策略一:临时切换(推荐用于单次命令)
# 临时让本次终端会话使用 JDK 11 export JAVA_HOME=$(/usr/libexec/java_home -v 11) export PATH="$JAVA_HOME/bin:$PATH" java -version # 输出 11.x # 关闭此终端,或新开一个,自动恢复原配置策略二:Shell 函数封装(推荐日常高频切换)
在~/.zshrc中添加:
# 定义快捷函数 jdk11() { export JAVA_HOME=$(/usr/libexec/java_home -v 11); export PATH="$JAVA_HOME/bin:$PATH"; echo "JDK 11 activated"; } jdk17() { export JAVA_HOME=$(/usr/libexec/java_home -v 17); export PATH="$JAVA_HOME/bin:$PATH"; echo "JDK 17 activated"; } jdk21() { export JAVA_HOME=$(/usr/libexec/java_home -v 21); export PATH="$JAVA_HOME/bin:$PATH"; echo "JDK 21 activated"; } # 使用:在终端输入 jdk17,回车,立刻切换策略三:项目级自动切换(推荐团队协作)
利用.zshrc的目录变更钩子(chpwd),实现“进入项目目录自动切 JDK”:
# 在 ~/.zshrc 底部添加 auto_jdk() { if [[ -f "./.jdk-version" ]]; then local ver=$(cat ./.jdk-version | tr -d '\r\n') export JAVA_HOME=$(/usr/libexec/java_home -v $ver 2>/dev/null) if [[ -n "$JAVA_HOME" ]]; then export PATH="$JAVA_HOME/bin:$PATH" echo "Auto-switched to JDK $ver" else echo "Warning: JDK $ver not installed" fi fi } chpwd() { auto_jdk } # 目录变更时触发 auto_jdk # 初始化当前目录然后在项目根目录创建.jdk-version文件,内容只有一行:
17实操心得:这个方案我在某跨平台系统开发中用了一年,效果极佳。团队成员 clone 代码后,
cd进入项目,终端自动提示“Auto-switched to JDK 17”,无需任何文档说明。.jdk-version文件纳入 Git,保证所有人环境一致。比 Docker 更轻量,比手动配置更可靠。
4.3 Linux/Windows 的等效方案:不要幻想“一键通用”
java_home是 macOS 专属。Linux 和 Windows 需要替代方案:
Linux:用
update-alternatives(Debian/Ubuntu)或alternatives(CentOS/RHEL)。例如:# 添加多个 JDK 到 alternatives 系统 sudo update-alternatives --install /usr/bin/java java /opt/jdk-11/bin/java 1 sudo update-alternatives --install /usr/bin/java java /opt/jdk-17/bin/java 2 # 交互式切换 sudo update-alternatives --config javaWindows:用批处理脚本或 Chocolatey 包管理器。例如用 Chocolatey:
choco install openjdk11 openjdk17 # 切换时执行 refreshenv set JAVA_HOME="C:\Program Files\OpenJDK\openjdk-17.0.1_12"
关键原则:无论用什么方案,目标只有一个——让
java -version的输出,和你项目pom.xml或build.gradle中声明的sourceCompatibility完全一致。不一致,就是未来 Bug 的温床。
5. IDE 配置深度解析:为什么 IDEA 显示“JDK not found”,即使终端里java -version正常?
这是最让人抓狂的场景:终端里java -version输出完美,mvn compile一切顺利,但 IntelliJ IDEA 却固执地显示 “No JDK specified” 或 “Project SDK is not defined”。原因很简单:IDEA 启动时,读取的是它自己的环境变量,而不是你终端里的~/.zshrc。它启动的进程,和你在 iTerm 里敲命令的进程,是两个独立的 shell 会话。
5.1 IDEA 的 JDK 加载优先级:五层覆盖逻辑
IDEA 配置 JDK 有明确的优先级顺序,从高到低:
- 项目级设置(
.idea/misc.xml中的<project-jdk-name>):最高优先级,覆盖所有; - 全局 SDK 配置(Settings → Project → Project SDK):对当前项目生效;
- IDE 启动参数(
Info.plist或idea.vmoptions中的-Didea.jdk):影响整个 IDE; - 系统环境变量(IDEA 启动时读取的
JAVA_HOME):仅当未配置 1-3 时生效; - 自动探测(扫描
~/Library/Java/JavaVirtualMachines/):最低优先级,仅作提示。
所以,当你在终端里export JAVA_HOME=...,IDEA 根本看不到——除非你用终端启动它:
# 正确:让 IDEA 继承当前终端的环境变量 open -a "IntelliJ IDEA.app" --args # 错误:双击 Dock 图标,启动的是独立的、无环境变量的进程5.2 三步精准配置法:从“找到 JDK”到“项目编译通过”
第一步:在 IDEA 中手动添加 SDK(永久解决“找不到”)
- 打开 IDEA → Preferences(macOS)或 Settings(Windows/Linux);
- 导航到Project → Project SDK;
- 点击右侧下拉框 →Add JDK...;
- 在弹出窗口中,不要点“Download JDK”(那是 Oracle 官方版,有许可风险);
- 点击“Add JDK” → “JDK” → 选择你解压好的 JDK 根目录(如
~/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64); - 确认后,IDEA 会自动识别版本号、JRE 路径、源码路径。
验证:点击 SDK 名称右侧的
...→"Show All Versions",应看到完整的 JDK 17 结构,包括src.zip(源码)、jmods/(模块)、lib/(核心库)。
第二步:绑定项目语言级别(防止“语法报错”)
添加完 SDK,IDEA 默认可能用Language level: 8。你需要手动匹配:
- Preferences → Project → Project language level → 选择17(或你 JDK 的实际版本);
- 同时检查 Modules → Sources → Language level,确保一致。
踩坑实录:某次我配置完 JDK 17,但项目里写
var list = new ArrayList<>(),IDEA 依然报错“Cannot resolve symbol 'var'”。检查发现 Project language level 是 10,没改。var是 JDK 10 引入的,但 IDEA 的 language level 必须显式设置,不会自动跟随 JDK 版本。
第三步:验证构建工具集成(Maven/Gradle 不走弯路)
IDEA 的 Maven/Gradle 插件,有自己的 JDK 设置:
- Preferences → Build → Build Tools → Maven → Importing → JDK for importer → 选择你刚添加的 JDK 17;
- Preferences → Build → Build Tools → Gradle → Project SDK → 同样选择 JDK 17。
关键细节:Gradle 的
gradle.properties中若写了org.gradle.java.home=/path/to/jdk11,会强制覆盖 IDEA 的设置。所以务必检查项目根目录下的gradle.properties,删除或注释掉这行。
5.3 VS Code 的 Java 配置:Extension Pack 的隐藏开关
VS Code 依赖Extension Pack for Java,其核心是redhat.java扩展。它的 JDK 配置逻辑不同:
- 它首先读取
JAVA_HOME环境变量; - 如果没找到,则扫描
~/Library/Java/JavaVirtualMachines/; - 最后,它允许你在
settings.json中硬编码:"java.configuration.runtimes": [ { "name": "JavaSE-17", "path": "/Users/me/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64" } ]
提示:VS Code 的 Java 扩展会自动下载
java-language-server(JLS),这个 JLS 进程本身也需要 JDK 运行。所以java.configuration.runtimes不仅指定项目编译用的 JDK,也指定 JLS 的运行时——双重作用,务必配准。
6. 终极验证:五个必跑命令,覆盖开发全流程
装完、配完、IDE 也设好了,别急着写代码。用这五个命令,做一次端到端验证,覆盖从基础运行、编译、构建到运行的全链路。每个命令失败,都指向一个具体环节的问题。
6.1 命令一:java -version(验证运行时环境)
java -version # 期望输出(以 Temurin JDK 17 为例): # openjdk version "17.0.1" 2021-10-19 # OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12) # OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode)- 失败表现:
command not found→PATH未正确配置; - 失败表现:输出
1.8.0_301→PATH指向了旧版,或JAVA_HOME未生效。
6.2 命令二:javac -version(验证编译器环境)
javac -version # 期望输出:javac 17.0.1- 失败表现:
command not found→JAVA_HOME/bin未加入PATH,或 JDK 目录下无javac(说明下载的是 JRE,不是 JDK); - 失败表现:版本号与
java -version不同 →PATH中存在多个javac,且旧版在前面。
6.3 命令三:mvn -v(验证构建工具链)
mvn -v # 期望输出包含: # Java version: 17.0.1, vendor: Eclipse Adoptium, ... # Apache Maven 3.8.6 (...)- 失败表现:
command not found→ Maven 未安装或PATH未配置; - 失败表现:Java version 显示 1.8 → Maven 的
JAVA_HOME覆盖了你的全局设置(检查mvn脚本头部或MAVEN_OPTS)。
6.4 命令四:java -cp . HelloWorld(验证类路径与手动编译)
先创建测试文件:
mkdir ~/test-java && cd ~/test-java echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello from JDK " + System.getProperty("java.version")); } }' > HelloWorld.java然后编译并运行:
javac HelloWorld.java java -cp . HelloWorld # 期望输出:Hello from JDK 17.0.1- 失败表现:
Error: Could not find or load main class HelloWorld→CLASSPATH或-cp设置错误,或HelloWorld.class未生成; - 失败表现:输出
Hello from JDK 1.8.0_301→java命令调用了错误的 JVM,PATH顺序错。
6.5 命令五:./gradlew --version(验证 Gradle 集成)
在任意 Gradle 项目根目录(或新建一个gradle init):
./gradlew --version # 期望输出包含: # Gradle 7.6 # Java home: /Users/me/Library/Java/JavaVirtualMachines/jdk-17.0.1+12-aarch64 # JVM version: 17.0.1- 失败表现:
JAVA_HOMEnot set → Gradle 脚本未读取到你的环境变量(检查gradlew脚本头部JAVA_HOME是否被硬编码); - 失败表现:JVM version 与预期不符 →
gradle.properties中org.gradle.java.home覆盖了设置。
最后一步:在 IDEA 中新建一个 Java 项目,选择 JDK 17,写一行
System.out.println("It works!");,点击绿色三角形运行。如果控制台输出这句话,且没有红色波浪线,恭喜,你的 Java 开发环境已全线贯通。
7. 常见故障排查手册:从报错信息反推根因
再完善的教程,也挡不住千奇百怪的报错。我把十年间收集的高频问题,按“错误现象 → 根本原因 → 三步修复法”整理成速查表。遇到问题,直接 Ctrl+F 搜索关键词。
| 错误现象(终端/IDE) | 根本原因 | 三步修复法 |
|---|---|---|
Error: JAVA_HOME is not defined correctly(Maven 报错) | Maven 的mvn脚本中硬编码了JAVA_HOME,或系统存在冲突的JAVA_HOME | 1. 运行 |