简介面向64位Windows平台的OpenJDK 21发行包是Java开发者获取最新开源JDK/JRE的便捷选择。OpenJDK 21作为Java的开源实现遵循GPLv2许可此版本属于非LTS的Early Access Draft适合在win x64环境体验最新语言特性、开展早期测试或教学研究。压缩包共484个文件主体为dll动态链接库、jmod模块文件、exe可执行工具与md说明文档并包含license等授权信息其中dll支撑运行时调用jmod对应模块化镜像exe内含常用开发命令整体大小约189.2MB。文件结构完整既有java、javac、javadoc等命令行工具也包含运行所需的类库与本地接口头文件可直接配置使用。目前已有571人学习下载可配合JEP了解未来Java演进方向该版本虽非长期支持但可提前感知新特性为后续升级决策提供参考。解压后配置环境变量即可在64位Windows上搭建开发或测试环境验证OpenJDK 21的兼容性与新特性适合希望跟进Java最新进展的开发者。1. 在Windows x64上装OpenJDK 21不是双击下一步就能收工很多开发者在Windows x64电脑上装OpenJDK 21以为从下载页拿个exe或msi、一路下一步就完事。真正开始写代码才会发现IDE能打开命令行里javac却报“不是内部或外部命令”Maven构建时又提示找不到JDK。OpenJDK 21是长期支持版本要让它同时被IDE、Maven、Gradle、命令行脚本认到至少要涉及版本选型、安装形式、环境变量、PATH顺序和安装后验证这几件事。我见过有人装完新版JDK还被旧版本顶掉也见过JAVA_HOME多拼了一个bin导致整套构建翻车。这篇笔记按我实际安装的顺序来写照着做几分钟就能在Windows x64上把OpenJDK 21跑通。2. 准备阶段openjdk21 的版本形式和系统要求先看完再下载下载OpenJDK 21之前我习惯先花两分钟确认系统环境免得装到一半发现下载错了架构或者把旧环境变量搞乱。这一步很多人会跳过等到报错才开始返工。其实检查项不多无非是系统位数、磁盘空间、已有JDK残留以及确认你需要的到底是安装器还是便携版。2.1 检查Windows系统位宽、版本和磁盘空间OpenJDK 21的Windows包分x64和x86吗官方发布的Windows版本主要就是Windows x64也有少量arm64构建版。如果你的电脑是x64下载标题带win x64的那个包就行。但在下载之前最好还是用一条命令确认系统架构免得下错包浪费流量。Get-CimInstance Win32_OperatingSystem | Select-Object Caption, OSArchitecture, TotalVisibleMemorySize这条命令会输出三列Caption显示Windows版本比如Windows 10 Pro或Windows 11 ProOSArchitecture如果是x64就说明是64位系统TotalVisibleMemorySize单位是KB除以1048576能换算成GB。我在部署时还会顺便看一眼系统版本号OpenJDK 21在Windows 10 1809以上的表现都正常Windows 7及更老系统就不建议试了即便装上也可能遇到API缺失。磁盘空间也要提前算一笔账。JDK 21完整安装后占用大约300MB左右如果后面还要用jmods生成自定义运行时需要额外预留空间。我一般建议在C盘留出至少1GB因为后续还要装构建工具和IDE缓存。如果C盘常年飘红就考虑用ZIP便携版把JDK放到其他盘不写注册表卸载时直接删目录。检查完系统还要看看机器里是不是已经有旧JDK或JRE。在PowerShell里执行where.exe java如果返回的不止一处说明PATH里有多个Java入口。这一步能看到残留但不能急着删要等新JDK安装后统一处理。2.2 版本命名与构建形式MSI、ZIP和“带不带JRE”的区别OpenJDK 21是LTS版本版本号规律是21.0.x后续会有补丁更新。下载时不要看到21就点尽量选21.0系列里最新的小版本因为前面几个补丁可能修过严重的安全漏洞。版本号一般在文件名里比如jdk-21_windows-x64_bin.zip这类文件的版本属于最新发布序列。构建形式是另一个容易踩坑的点。常见发布渠道提供两种文件对比项MSI安装器ZIP压缩包安装复杂度双击向导或静默安装步骤固定解压到目标目录即可环境变量部分MSI会写注册表和PATH必须手动配置卸载方式通过系统设置-应用卸载删除整个目录多版本共存对新手友好但切换麻烦适合在PATH里灵活切换适用场景单机开发、教程演示内网部署、脚本化环境构建选择MSI还是ZIP主要看你的使用习惯和公司环境。MSI装完会关联.jar文件、写注册表、可能设置JAVA_HOME适合不想手动碰系统变量的人。但如果经常在多个JDK版本之间切换我更推荐ZIP便携版把两个版本的JDK放在不同目录需要时改JAVA_HOME和PATH就行。还有一个听起来玄学的区别有些构建版自带jre目录有些没有。OpenJDK 21的标准压缩包里一般不提供独立JRE目录只提供jmods模块文件。如果你需要单独的最小运行时得自己用jlink命令裁剪。这个不是安装失败而是新版JDK刻意为之。看到解压后没有jre别慌bin、conf、lib这些核心目录都在就行。2.3 下载与校验SHA256、签名和压缩包大小下载OpenJDK 21要到官方发布页面找Windows x64的链接。文件名里通常包含jdk-21和windows-x64还会有bin字样表示是二进制版不是源码包。下载完成后我强烈建议先做校验这一步能拦截大部分由网络传输损坏、镜像站篡改导致的问题。Get-FileHash .\jdk-21_windows-x64_bin.zip -Algorithm SHA256 Get-AuthenticodeSignature .\jdk-21_windows-x64_bin.msiGet-FileHash会计算文件指纹你应该拿它和发布页上提供的SHA256字符串比对如果完全一致说明下载的文件没被改动过。Get-AuthenticodeSignature用来查看数字签名如果显示Valid说明签名有效发布者身份可信。哈希不一致的包我一般直接删掉重新下载不去赌它能正常安装。这里有个小细节下载时注意看文件大小是不是和官网标注的差不多。如果ZIP包只有几MB很可能下载被代理拦截或磁盘已满导致文件不完整。完整JDK压缩包通常在180MB到200MB之间。下载完成先确认大小再算哈希能省下后面安装阶段排查问题的功夫。3. 安装OpenJDK 21MSI安装器和ZIP压缩包两条路径这一章讲两条安装路径。用MSI装向导会自动做很多配置但你不一定知道它背后改了什么用ZIP装一切透明可控但要手动处理环境变量。两部分我都会把步骤写全并说明每一步实际做了什么这样你换一台机器也能照着操作。3.1 用MSI安装器自动配置环境变量可还是得检查MSI安装器适合桌面环境双击运行后进入向导。整个过程比较简单但有几个选项不是默认勾选的容易被忽略。到了功能选择页面会看到“Add to PATH”和“Set JAVA_HOME variable”之类的选项需要手动确认勾上。如果没勾安装完成后不会有JAVA_HOMEPATH里也没有JDK入口相当于白装。如果你要在多台机器上批量部署用界面装太慢可以直接走静默安装。管理员权限的PowerShell里执行msiexec /i jdk-21_windows-x64_bin.msi /qn /norestart /L*v install.log参数解释/i指定安装包/qn表示无交互安装/norestart禁止安装完成自动重启/L*v install.log把详细日志写到当前目录下的install.log。静默安装的好处是可以在脚本里重复执行但问题是不容易看到功能选项JAVA_HOME不一定被设置。所以装完一定要检查环境变量再补手动配置。MSI安装完成后有些版本会创建名为“javapath”的目录里面放的是符号链接或快捷方式。这个目录的作用是提供给其他程序一个稳定的Java入口但如果PATH里旧版本路径排在前面新的java -version依然会显示旧版本。所以MSI装完别急着开IDE先开一个全新的PowerShell窗口验证版本。3.2 用ZIP压缩包便携式安装的取舍和路径规划ZIP便携版的好处是解压即用、不污染注册表适合在测试环境快速切换Java版本。缺点是环境变量全部要手动配而且如果变更路径已有的JAVA_HOME就失效了。我倾向于把所有JDK放在同一个父目录下比如C:\Java\jdk-21这样未来想换成jdk-22只需要把PATH里的入口改掉不用动JAVA_HOME指向的根结构。解压之前先规划路径。如果你选择C:\Program Files\Java\jdk-21注意路径里有空格后面配置环境变量和编写脚本时要记得加引号。如果不想跟空格缠斗就放到无空格目录比如C:\java\jdk-21。解释一下为什么我推荐无空格路径很多老构建脚本、批处理文件处理带空格的路径时经常翻车少一个引号就报找不到命令。在PowerShell里用下面的命令解压ZIP包到指定目录Expand-Archive -Path .\jdk-21_windows-x64_bin.zip -DestinationPath C:\Java -ForceExpand-Archive是PowerShell自带命令-Path指定压缩包-DestinationPath指目标目录-Force表示如果目标目录已有文件就强制覆盖。解压完成后C:\Java下会出现类似jdk-21.0.x的文件夹。注意有些ZIP包解压后目录名带完整小版本号比如jdk-21.0.3你最好建一个固定名字的目录或者用软链接避免以后升级路径跟着变化。ZIP方式安装还有一个潜在误区有人为了省事把整个JDK目录放到U盘或网络盘里然后在不同电脑上直接调用。实际上JDK在安装时写的一些配置和系统相关如果你是在别的机器上解压的ZIP放到新机器可能因为权限和路径问题报找不到模块。建议每台机器都单独从官方ZIP包解压不要相互拷贝整个JDK目录。3.3 安装后的目录结构bin、lib、conf、jmods都是干什么的装完之后最好先看一眼目录结构确认文件齐全。如果你用的是ZIP解压进入JDK根目录下面应该至少有这些内容目录/文件作用bin存放java.exe、javac.exe、jshell.exe、jar.exe等可执行文件confJVM配置、安全策略、logging配置等include编写JNI程序需要的C语言头文件jmodsJDK模块化镜像供jlink裁剪运行时使用legal各模块的版权和许可证文件lib动态链接库、静态库和jvm.dll等release记录JDK版本号和模块信息的属性文件看到没有jre目录不用怀疑装错OpenJDK 21标准包确实不带独立JRE。bin目录里有没有javac.exe基本能判断这个JDK是不是完整的开发工具包。如果只有java.exe没有javac.exe说明你拿到的是JRE或精简版需要换一个完整JDK包。conf目录经常被人忽略。有的应用想调JVM参数翻遍整个系统找不到jvm.options代表它以为没有配置文件实际上JDK 21默认把配置放在conf目录里比如conf/security/java.security。如果你遇到证书校验问题、加密算法被限制第一件事就该查这个文件而不是去改注册表。4. 配置环境变量JAVA_HOME和PATH里最容易翻车的三个细节安装完OpenJDK 21真正的重头戏是配置环境变量。这一步决定了命令行能不能直接调javac构建工具能不能找到JDK。很多人的安装问题出在JAVA_HOME多写了一个bin、PATH里旧路径没清、新终端没有刷新环境变量。这一章挑三个最容易翻车的地方展开。4.1 JAVA_HOME应该指向JDK根目录不是bin目录JAVA_HOME是很多Java工具约定俗成的环境变量Maven、Gradle、Tomcat都会读它。它应该指向JDK的根目录也就是包含bin、lib、conf的上一层目录。常见错误是把JAVA_HOME设成C:\Java\jdk-21\bin导致工具去%JAVA_HOME%\lib找库时变成C:\Java\jdk-21\bin\lib必然找不到。设置环境变量可以用系统属性界面也可以在管理员PowerShell里执行setx /M JAVA_HOME C:\Java\jdk-21/M参数表示修改系统级环境变量需要管理员权限后面的路径就是JDK根目录不要带bin。不带/M则默认写进当前用户的环境变量如果这台机器只有一个开发账号用户级也够用但我更建议写系统级因为很多Windows服务是以SYSTEM账号运行的它们读不到用户级变量。还有一个细节JAVA_HOME路径的小版本号会变。如果目录名是jdk-21.0.3你写死了这个版本号下次升级到21.0.4就要改变量。所以安装ZIP版时我通常会把目录名统一改成jdk-21去掉小版本号这样升级时旧目录删除新目录复制过来环境变量不用动。4.2 PATH用%JAVA_HOME%\bin并清掉旧java路径PATH要加的是%JAVA_HOME%\bin不是JDK根目录本身。因为执行java、javac这些命令需要的是bin目录。而且这个条目要尽量放在PATH的前面Windows执行命令时是按顺序搜索PATH目录的排在后面的目录即使存在对应程序也不会优先被选中。添加PATH的常见做法是打开系统属性里的“环境变量”找到Path点击编辑新建一条%JAVA_HOME%\bin。如果你用命令行改可以读取当前机器级别的PATH再拼接新路径写回去$oldPath [Environment]::GetEnvironmentVariable(Path,Machine) $newPath %JAVA_HOME%\bin; $oldPath setx /M Path $newPath这个脚本先取旧值然后在最前面插入%JAVA_HOME%\bin。用%JAVA_HOME%而不是写死具体路径的好处是以后只要JAVA_HOME正确PATH就不用动。注意setx有字符长度限制如果现有PATH已经很长拼接后可能被截断风险在于截断会把后面一些关键路径弄丢。所以对于PATH特别复杂的机器我更推荐用图形界面手动编辑至少能看到完整值。接下来要清掉旧Java路径。常见的有两类一类指向其他JDK安装目录比如C:\Java\jdk-17\bin另一类指向系统自带的javapath目录。javapath目录是什么时候出现的通常是装了某些软件后自动加上去的里面放了一些指向新JDK的符号链接但有时也指向旧版本。如果PATH里前面的%JAVA_HOME%\bin没生效很大概率是因为javapath排在前面。处理方式很简单在系统环境变量的Path列表中把所有和Java相关的条目删掉只保留%JAVA_HOME%\bin。4.3 环境变量生效范围setx和当前终端的关系设置完环境变量很多人继续在同一个终端窗口里敲java -version结果看到的还是旧版本就开始怀疑自己配置失败实际上是环境变量的生效范围问题。setx修改的是注册表里持久化的环境变量而当前进程的环境变量表是启动时从注册表读取的不会实时更新。刷新当前会话的变量有两种办法。最简单的是直接关掉当前终端重新开一个新的PowerShell窗口新窗口启动时会读取最新的注册表环境变量。如果你想不关窗口就刷新可以手动给当前会话重新赋值$env:Path [Environment]::GetEnvironmentVariable(Path,Machine) ; [Environment]::GetEnvironmentVariable(Path,User) $env:JAVA_HOME [Environment]::GetEnvironmentVariable(JAVA_HOME,Machine)这段命令把机器级和用户级的Path重新拼起来赋给当前进程的$env:Path同时刷新JAVA_HOME。执行完再敲java -version应该能读到新值。但要注意这条命令只对当前PowerShell窗口有效其他已经打开的终端、IDE窗口仍然保留旧环境变量必须全部重启才能稳定。对于IDE和构建工具环境变量的刷新更讲究。IDE启动时会把环境变量缓存进内存即使终端里已经能正确显示java -versionIDE内部可能还保留着旧配置。遇到这种情况不要只看命令行强制重启IDE有缓存机制的服务进程也要一并重启。5. 避坑OpenJDK 21在Windows x64上最常遇到的5个问题这一章整理的是我实际踩过的坑每条都按“现象、原因、解决”的顺序写方便你对照排查。OpenJDK 21本身在Windows x64上运行很稳定出问题大多是环境变量、路径格式和旧版本残留造成的。5.1 现象java -version有输出但javac找不到很多人装完会看到java -version能正常打印版本但敲javac却提示“javac不是内部或外部命令”。为什么java能跑而javac找不到最直接的原因就是PATH里只配置了指向JRE或旧java.exe的路径没有包含JDK的bin目录。如果之前系统里装过单独的JREjava命令能找到javac自然找不到。解决方法是确认当前生效的java从哪条路径来。执行where.exe java查看结果里的第一个路径再执行where.exe javac。如果java路径来自javapath或旧JRE目录javac必然不存在。把PATH改成%JAVA_HOME%\bin并保证这个条目排在开头然后重开终端。如果javac还是找不到检查JAVA_HOME是否指向根目录以及bin目录里是否真的有javac.exe。5.2 现象IDE能运行项目但Maven报错找不到JDKIDE自带开发者可以顺利打开项目Maven却报错“Could not find JDK”或“No JVM installation found”。原因在于IDE有时不读系统PATH而是用自己的配置文件指定JDKMaven则严格依赖JAVA_HOME。只要JAVA_HOME没设对Maven连第一步都走不通。解决办法是确认JAVA_HOME存在且指向正确。在PowerShell里执行echo $env:JAVA_HOME如果输出为空或路径带bin就按上一章的方法重新设置。还有一点Maven是通过mvn.cmd启动的脚本里会读取java.exe所以PATH也必须有%JAVA_HOME%\bin。如果设置后Maven仍报错重启终端再试。5.3 现象脚本里路径带空格导致命令被拆开Windows x64的默认安装路径是C:\Program Files\Java\jdk-21这个路径本身没问题但在批处理脚本里如果写成set JAVA_HOMEC:\Program Files\Java\jdk-21后续引用时没加引号就会因为Program Files之间的空格把路径拆成两段导致脚本认为JDK目录不完整。解决方法是所有引用JAVA_HOME的地方都加双引号比如%JAVA_HOME%\bin\java.exe。更省心的做法是从一开始就选无空格安装路径比如C:\Java\jdk-21。如果你的团队里有多个成员统一约定JDK路径也不带空格能减少很多莫名其妙的部署失败。5.4 现象升级后java -version还是旧版本升级OpenJDK 21小版本后运行java -version仍然显示旧的版本号看起来像升级没生效。其实多半不是升级失败而是系统里存在多个Java安装路径PATH里旧的路径排在前面新JDK的bin目录被忽略了。解决时先用where.exe java列出所有java.exe位置看看第一个是不是新版JDK。如果不是调整PATH顺序把新版%JAVA_HOME%\bin放在最前如果是javapath目录引用导致关闭该目录在PATH里的条目。另一个隐患是注册表里的JavaSoft键还指向旧版本有些Windows应用会读注册表找Java此时需要到系统设置的应用列表里卸载旧JDK或者把注册表里的HKLM\SOFTWARE\JavaSoft\Java Development Kit下的当前版本键清除干净。5.5 现象ZIP包解压后双击jar包没反应用ZIP便携版装完在资源管理器里双击.jar文件没有任何反应是因为.jar文件的关联程序没有注册到系统。MSI安装器会自动关联但ZIP版不会写关联信息。临时解决方式是用命令行手动运行java -jar xxx.jar这不依赖文件关联。想恢复双击启动可以右键.jar文件选择“打开方式”再指向%JAVA_HOME%\bin\javaw.exe。如果以后切到其他JDK版本双击可能又失效因为关联路径写死了。所以对便携版我更习惯保留一个快捷方式指向java -jar少用双击。6. 验证openjdk21是否跑通从版本命令到最小Java程序装完不能光看安装成功要实际验证命令行、编译器和运行时都正常。这一章给你一套完整的检查流程每一条跑通说明openjdk21环境已经可用了。6.1 三条命令确认核心组件打开一个全新的PowerShell窗口依次执行java -version javac -version jshell --versionjava -version会输出类似openjdk version 21.0.x的字样说明运行时和JAVA_HOME生效javac -version确认编译器可用jshell --version用来验证交互式开发工具。如果前两条正常但jshell找不到说明PATH里可能混入了旧JDK的bin目录因为新版JDK才有jshell。三条命令都通过后还要看java -version认可的是不是21如果显示17或其他版本回头检查PATH顺序和残留路径。6.2 编译并运行一个最小的Java程序版本命令只说明程序能找到能不能编译运行还要真正写个文件试。在任意工作目录下创建Hello.javapublic class Hello { public static void main(String[] args) { System.out.println(Hello OpenJDK 21); } }然后在同一目录执行javac Hello.java java Hellojavac会生成Hello.class文件java Hello运行它并输出Hello OpenJDK 21。如果javac在但运行时报“类 Hello 不是公共的”之类的错误说明类名和文件名不一致改掉即可。这一步过了说明编译、类加载、运行时全链路正常。6.3 进一步用jar和jdeps验证模块链路如果只是普通开发上一节已经够用。想确认JDK 21的模块化工具也正常可以再补两条命令jar cf hello.jar Hello.class jdeps --list-deps hello.jarjar将class文件打包成hello.jarjdeps --list-deps列出这个JAR依赖的模块通常会输出java.base。如果能看到模块名说明模块系统工具没问题后续用jlink裁剪运行时也会顺畅很多。从那以后我每次在Windows x64上装完openjdk21都会强制把所有终端关掉重新打开一个跑完这三组验证才放心交给构建脚本。踩过太多次“刚装好看着正常第二天构建突然说找不到JDK”的坑我才意识到验证不是走过场而是把环境变量、PATH、模块工具一次锁死。希望这份安装笔记能帮你少走这些弯路也欢迎按这个流程在自己的机器上复现一遍。本文还有配套的精品资源点击获取