
1. 为什么我建议你手动装一遍 JDK 17 而不是随手抓个包JDK 17 是 Java 生态里一个绕不开的版本。它是继 JDK 8 和 JDK 11 之后的第三个 LTS长期支持版本Oracle 官方给它的支持周期一直排到 2029 年各大主流框架——Spring Boot 3.x、Spring Framework 6.x、Micrometer、Jakarta EE 9——都把 JDK 17 作为最低门槛。换句话说你现在新建一个 Java 后端项目如果还在用 JDK 8很多新版本的依赖你连编译都过不去。但问题来了网上搜“jdk-17 下载 windows”出来的结果五花八门。有让你去某度网盘下“绿色版”的有让你装个“一键运行包”的还有各种来路不明的“免安装版”。我自己就踩过坑——早年间图省事下过一个所谓的“jdk 运行包”解压完 JAVA_HOME 配好了结果跑 Maven 构建的时候报了一堆莫名其妙的证书错误排查了半天才发现那个包里的 cacerts 被替换过。从那以后凡是 JDK 这种东西我一律只从官方渠道拿。这篇内容就是把我自己在 Windows 上装 JDK 17 的完整流程、踩过的坑、以及一些容易被忽略的细节整理出来。不管你是刚接触 Java 的新手还是换了新电脑要重新配环境的老手照着走一遍基本不会出问题。核心关键词就三个jdk-17、windows、运行包——我会把“运行包”这个概念也掰开讲清楚因为很多人对 JRE 和 JDK 的区别其实是模糊的。先说结论Windows 上装 JDK 17最稳的路子就是去 AdoptiumEclipse Temurin或者 Oracle 官网下 MSI 安装包双击、下一步、配环境变量十分钟搞定。下面我把每一步拆开讲包括为什么这么做、不这么做会怎样。2. 先把概念理清楚JDK、JRE 和所谓“运行包”到底啥关系2.1 JDK 和 JRE 不是一回事别混着用很多人嘴上说“装个 JDK”实际需求可能只是“跑一个 jar 包”。这两件事对应的东西不一样。JREJava Runtime EnvironmentJava 运行时环境。它包含 JVMJava 虚拟机和核心类库只能用来运行已经编译好的 Java 程序。你如果只是要跑一个别人给你的.jar文件理论上装 JRE 就够了。JDKJava Development KitJava 开发工具包。它在 JRE 的基础上多了编译器javac、打包工具jar、文档工具javadoc、调试工具jdb等等。你要写代码、编译代码就必须装 JDK。那“运行包”是什么这个词其实不是官方术语是民间叫法。通常指两种情况一种是别人打包好的 JRE 精简版解压就能跑 Java 程序另一种是某些工具比如某些 IDE 或服务器软件自带的嵌入式运行时。问题在于这些“运行包”来源不明版本混乱有的还缺模块。JDK 9 之后引入了模块化系统JPMS一个完整的 JDK 包含几十个模块精简过的运行包很可能缺了java.sql、java.naming这类你项目里刚好用到的模块跑起来就报NoClassDefFoundError。所以我的建议很直接除非你明确知道自己只需要跑一个特定程序否则一律装完整 JDK。硬盘上多占那两三百兆换来的是省心。2.2 为什么偏偏是 JDK 17你可能会问JDK 21 都出了为什么还盯着 17原因有几个第一LTS 的稳定性。JDK 17 从 2021 年 9 月发布到现在已经经过大量生产环境验证bug 修复得很充分。非 LTS 版本比如 18、19、20只维护六个月拿来做生产环境是给自己找麻烦。第二生态兼容性。Spring Boot 3.x 要求最低 JDK 17而目前企业里存量最大的还是 Spring Boot 2.x JDK 8 的组合。往上升级JDK 17 是跳板。你直接跳到 21有些老依赖还没适配。第三性能提升实打实。JDK 17 相比 JDK 8在 G1 垃圾回收器、ZGCJDK 15 转正、以及整体 JIT 编译优化上都有明显进步。我实测过一个中等规模的 Web 服务同样的代码从 JDK 8 迁到 17吞吐量大概提升了 15% 到 20%GC 停顿时间缩短了一半以上。2.3 Windows 平台的特殊性Windows 上装 JDK 和 Linux/macOS 有个本质区别环境变量的配置方式。Linux 上你改.bashrc或者/etc/profile就行macOS 用~/.zshrc。Windows 是图形化的“系统属性 → 环境变量”那一套而且分“用户变量”和“系统变量”很多人在这里翻车。另外 Windows 的路径分隔符是反斜杠\而 Java 内部很多地方用正斜杠/配置的时候要注意。还有一点Windows 上如果之前装过其他版本的 JDKPATH 里可能有残留导致java -version显示的还是旧版本。这些细节后面都会讲到。3. 下载环节去哪下、下哪个、怎么验证3.1 官方下载渠道对比Windows 上获取 JDK 17主要有这么几个来源我列个表对比一下来源发行版名称安装包格式是否免费商用特点Eclipse AdoptiumTemurin 17MSI / ZIP是社区维护最推荐OracleOracle JDK 17MSI / ZIP有条件免费需注意许可条款MicrosoftMicrosoft Build of OpenJDK 17MSI / ZIP是与 Windows 集成好AmazonCorretto 17MSI / ZIP是AWS 环境常用AzulZulu 17MSI / ZIP是有免费版和企业版我个人的首选是Eclipse Temurin。它是 Adoptium 项目下的产物由 Eclipse 基金会维护完全开源免费商用也没问题。而且它提供的 MSI 安装包会自动帮你配好环境变量可选省事。Oracle JDK 17 要注意从 JDK 17 开始Oracle 采用的是 NFTCNo-Fee Terms and Conditions许可简单说就是免费用但如果你要商用且需要长期安全更新得买订阅。对于个人学习和大多数中小项目用 Temurin 更省心。3.2 具体下载步骤以 Temurin 为例操作路径是这样的打开浏览器访问 Adoptium 官网搜“Adoptium Temurin 17”就能找到。在版本选择里选17 - LTS。操作系统选Windows架构选x64除非你是 ARM 设备那就选 aarch64。包类型选JDK不是 JRE。安装包格式选.msi这是 Windows 的标准安装包比 ZIP 好管理。下载下来的文件名大概长这样OpenJDK17U-jdk_x64_windows_hotspot_17.0.9_9.msi。文件名里的17.0.9_9是具体的小版本号数字越大越新建议选最新的。注意下载的时候认准adoptium.net这个域名。网上有很多镜像站和“加速下载”页面虽然大部分是善意的但为了安全起见还是走官方源。如果官方源下载慢可以找清华 TUNA 或者中科大 USTC 的开源镜像站这些是可信的。3.3 校验文件完整性这一步很多人跳过但我建议你别省。下载完 MSI 之后官方页面通常会提供一个 SHA256 校验值。你可以在 PowerShell 里跑一条命令验证Get-FileHash -Algorithm SHA256 C:\Users\你的用户名\Downloads\OpenJDK17U-jdk_x64_windows_hotspot_17.0.9_9.msi把输出的哈希值和官网上的对比一致就说明文件没被篡改、没下坏。这一步在下载大文件或者网络不稳定的情况下特别有用。我有一次下载到一半网络断了文件大小看着对但实际是坏的装到一半报错白折腾半小时。4. 安装过程MSI 双击之后那些选项怎么选4.1 安装向导逐项说明双击 MSI 之后会弹出一个标准的 Windows 安装向导。几个关键页面第一页欢迎界面直接 Next。第二页安装路径。默认是C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot\。我建议保持默认不要改到中文路径或者带空格的路径下。原因很简单有些老旧的构建工具比如某些版本的 Ant、Maven 插件对路径里的空格和中文处理不好会报奇怪的错误。C 盘空间紧张的话可以改到D:\DevTools\jdk-17这种纯英文无空格路径。第三页功能选择。这里有几个复选框重点说两个Add to PATH勾上。这会把java.exe、javac.exe等命令加到系统 PATH 里让你在任何目录下都能直接敲命令。Set JAVA_HOME variable勾上。这会自动创建一个名为JAVA_HOME的系统变量指向 JDK 安装目录。很多工具Maven、Gradle、Tomcat都依赖这个变量。Set JavaSoft registry keys一般也勾上某些安装程序会读注册表找 Java 位置。第四页开始安装点 Install等进度条走完。4.2 安装完先别急着写代码验证一下装完之后关掉所有已经打开的 CMD 和 PowerShell 窗口重新开一个。因为环境变量的更新不会自动同步到已经打开的终端里这是新手最常犯的错——装完了在旧窗口里敲java -version发现还是旧版本以为没装成功。新开一个 PowerShell依次敲java -version javac -version echo $env:JAVA_HOME预期输出java -version显示openjdk version 17.0.9 ...javac -version显示javac 17.0.9echo $env:JAVA_HOME显示 JDK 的安装路径如果java -version显示的版本不对或者提示“不是内部或外部命令”那就是 PATH 没配好往下看排查部分。4.3 手动配置环境变量MSI 没勾选的情况如果你下载的是 ZIP 版或者安装时没勾选自动配置那就得手动来。步骤右键“此电脑” → 属性 → 高级系统设置 → 环境变量。在“系统变量”区域点“新建”变量名填JAVA_HOME变量值填 JDK 的根目录比如C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot。注意不要带\bin。找到系统变量里的Path双击编辑新增一条%JAVA_HOME%\bin。一路确定保存。这里有个细节Path里如果已经有旧版本 JDK 的路径比如C:\Program Files\Java\jdk1.8.0_291\bin要么删掉要么确保%JAVA_HOME%\bin排在它前面。Windows 的 PATH 是从上往下找的找到第一个java.exe就用它。提示改完环境变量一定要重开终端。我见过太多人在旧窗口里反复敲命令然后怀疑人生。5. 多版本共存一台机器上同时装 JDK 8 和 JDK 17 怎么管5.1 为什么需要多版本共存现实情况是你手头可能有老项目跑在 JDK 8 上新项目要用 JDK 17。总不能装一个卸一个。Windows 上多版本共存是完全可行的关键是把 PATH 和 JAVA_HOME 管好。我的做法是JAVA_HOME 指向当前默认版本PATH 里只放%JAVA_HOME%\bin不放具体版本的路径。这样切换版本只需要改 JAVA_HOME 一个变量。5.2 用脚本快速切换版本手动改环境变量太麻烦我写了个 PowerShell 脚本放在桌面需要切换的时候右键“以管理员身份运行”# switch-jdk.ps1 param( [string]$version 17 ) $jdkPaths { 8 C:\Program Files\Java\jdk1.8.0_291 11 C:\Program Files\Eclipse Adoptium\jdk-11.0.20.8-hotspot 17 C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot } if (-not $jdkPaths.ContainsKey($version)) { Write-Host 不支持的版本: $version exit 1 } $newPath $jdkPaths[$version] [Environment]::SetEnvironmentVariable(JAVA_HOME, $newPath, Machine) Write-Host JAVA_HOME 已切换到: $newPath Write-Host 请重新打开终端使配置生效用的时候在管理员 PowerShell 里跑.\switch-jdk.ps1 -version 8就切到 JDK 8 了。这个脚本的核心是[Environment]::SetEnvironmentVariable这个方法第三个参数Machine表示改的是系统变量需要管理员权限。5.3 项目级别的版本隔离如果你用 Maven可以在pom.xml里通过maven-compiler-plugin指定编译版本但运行时用的还是系统默认 JDK。真正要做到项目级隔离得靠 IDE 的配置。IntelliJ IDEA 里可以在File → Project Structure → SDKs里添加多个 JDK然后每个项目单独选。VS Code 则是通过settings.json里的java.configuration.runtimes配置。这里提一句编译版本和运行版本可以不一样。比如你可以用 JDK 17 编译出兼容 JDK 8 的字节码javac --release 8但反过来不行。所以升级的时候先用 JDK 17 编译、JDK 8 运行验证没问题了再全面切换是个稳妥的过渡策略。6. 常见问题排查那些让你怀疑人生的报错6.1 问题速查表我把这些年遇到过和帮别人解决过的典型问题整理成表现象可能原因解决方法java不是内部或外部命令PATH 没配或没生效检查 PATH 是否含%JAVA_HOME%\bin重开终端java -version显示旧版本PATH 里有旧 JDK 路径且排在前面调整 PATH 顺序或删除旧路径JAVA_HOME指向了 JRE 目录装错包或路径填错改成 JDK 根目录JRE 目录下没有javac编译报无效的源发行版: 17编译器版本低于 17确认javac -version是 17运行报UnsupportedClassVersionError编译用高版本运行用低版本统一版本或用--release编译MSI 安装报错 2503/2502权限不足用管理员身份运行安装包中文乱码默认编码不是 UTF-8加-Dfile.encodingUTF-8启动参数6.2 几个典型场景的详细排查场景一装完 JDK 17java -version还是 1.8。这是最高频的问题。原因几乎都是 PATH 里旧版本路径排在前面。打开环境变量看 Path 列表把%JAVA_HOME%\bin用“上移”按钮挪到最上面或者把旧的C:\ProgramData\Oracle\Java\javapath这类路径删掉。注意C:\ProgramData\Oracle\Java\javapath是 Oracle 安装时自动加的里面是java.exe的快捷方式很容易被忽略。场景二JAVA_HOME配了但 Maven 说找不到。Maven 找 JDK 的逻辑是先看JAVA_HOME找不到再看 PATH。如果JAVA_HOME的值末尾多了个分号或者路径里带了引号Maven 就解析不了。正确写法是C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot干干净净不带引号不带分号。场景三IDEA 里能跑命令行跑不了。这说明 IDEA 用的是它自己配置的 JDK跟系统环境变量无关。IDEA 的Project Structure → SDKs里可以独立指定。这种情况不算问题但要知道两套配置是分开的。场景四javac能用但java不能用或者反过来。这通常是因为 PATH 里同时存在 JDK 的bin和 JRE 的bin而且顺序混乱。JRE 的bin里只有java.exe没有javac.exe。解决办法就是确保 PATH 里只有%JAVA_HOME%\bin这一条 Java 相关路径。6.3 一个容易被忽略的坑Windows 的“应用执行别名”Windows 10 和 11 有个功能叫“应用执行别名”App Execution Aliases在“设置 → 应用 → 高级应用设置 → 应用执行别名”里。这里可能有个java.exe的别名指向微软商店的 Java。如果你敲java弹出的是应用商店就是这个在作怪。把对应的开关关掉就行。这个坑我踩过一次当时在一台新装的 Win11 上配环境怎么改 PATH 都没用最后发现是系统自带的别名拦截了。排查的时候可以用where.exe java命令看看系统到底找到了几个java.exe按顺序列出来的第一个就是实际执行的。7. 装完之后让 JDK 17 真正跑起来的几个实操建议7.1 验证一个完整的编译运行流程光看版本号不够我习惯写个最小的程序验证整条链路// Hello.java public class Hello { public static void main(String[] args) { System.out.println(JDK version: System.getProperty(java.version)); System.out.println(Encoding: System.getProperty(file.encoding)); System.out.println(中文测试); } }然后javac Hello.java java Hello预期输出里版本是 17编码是 UTF-8中文正常显示。如果中文乱码说明控制台编码和 Java 默认编码不一致。Windows 的 CMD 默认是 GBK可以在运行前执行chcp 65001切到 UTF-8或者给java加-Dfile.encodingUTF-8。7.2 配置 Maven 使用 JDK 17如果你用 Maven确认mvn -version输出里的 Java version 是 17。不是的话检查JAVA_HOME。另外在pom.xml里显式声明编译版本properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /propertiessource和target都设成 17保证编译出的字节码是 17 版本。project.build.sourceEncoding设成 UTF-8避免源码里的中文注释导致编译警告。7.3 关于“运行包”的最终建议回到标题里的“运行包”三个字。如果你确实只需要运行 Java 程序、不做开发那用 jlink 自己生成一个精简运行时是更专业的做法。JDK 17 自带的jlink工具可以根据你的程序依赖的模块打包出一个只有几十兆的定制 JREjlink --add-modules java.base,java.sql --output my-runtime --strip-debug --compress 2这样生成的my-runtime目录就是你的专属“运行包”体积小、启动快、没有多余东西。但前提是你得先有个完整的 JDK 来做这个操作。所以绕来绕去完整 JDK 还是得装。7.4 我个人的几条经验第一别用绿色版、别用网盘包。JDK 这东西官方免费没有任何理由去用来路不明的版本。省那几分钟下载时间可能换来几小时的排查。第二环境变量改完必须重开终端。这是铁律没有例外。第三多版本共存时PATH 里只留%JAVA_HOME%\bin。这是最干净的管理方式切换版本只改一个变量。第四遇到版本不对先用where.exe java看看到底执行的是哪个。这个命令比瞎猜快得多。第五MSI 安装包比 ZIP 好管理。MSI 能在“应用和功能”里看到、能卸载、能修复ZIP 解压完就是一堆文件时间长了你自己都忘了装在哪。最后分享一个小技巧如果你经常需要在不同 JDK 版本之间切换可以在 PowerShell 的 profile 文件$PROFILE里定义几个函数比如use-jdk8、use-jdk17每次开终端自动加载。这样切换版本就是敲一个命令的事比改环境变量快多了。我现在的工作机上就是这么干的JDK 8、11、17、21 四个版本随时切互不干扰。