简介:本资源为OpenJDK 21官方开源Java开发工具包的Windows x64平台完整发行版,面向Java中高级开发者、教学实验人员及技术预研者,用于本地搭建符合JDK 21规范的开发与运行环境,支持新特性验证(如虚拟线程、结构化并发、未命名变量等JEP增强提案)及LTS前技术尝鲜。压缩包共484个文件,含70个jmod模块文件(构成JDK核心运行时模块系统)、36个exe可执行工具(如javac、java、jshell)、87个dll动态链接库(保障Windows平台原生调用),以及license、security、cacerts等关键配置与安全组件,整体体积189.2MB,开箱即用。目前已有575人学习下载,资源结构完整、目录层级清晰,包含完整的JRE+JDK双环境、源码符号(src、sym)、调试支持(jsa、classlist)及多语言本地化资源(ja、zh等),便于深入理解JVM机制、定制构建或开展兼容性测试。
1. OpenJDK 21 for Windows x64:别急着点安装包,先看清 JDK 版本玄学
你是不是也经历过——下载了标着“OpenJDK 21”的压缩包,解压后双击java.exe没反应,java -version报错“不是有效的 Win32 应用程序”,或者在 IDE 里配好路径却提示“Unsupported class file major version 65”?这不是你电脑坏了,而是掉进了 OpenJDK 21 的版本陷阱:Windows 平台下,x64 架构 ≠ 所有 x64 都能跑;OpenJDK 21 ≠ 所有叫 21 的都支持你的 JDK 项目编译目标。很多团队在升级 Spring Boot 3.x、GraalVM 原生镜像或启用虚拟线程(Virtual Threads)时,卡在第一步——连javac都编译不出.class文件。这套 OpenJDK 21 Win x64 环境,专为需要稳定支撑 Java 21 新特性(如Pattern Matching for switch、Sequenced Collections、Unnamed Variables and Patterns)、又必须在 Windows 开发机/CI Agent 上落地的开发者准备。它不面向只写 Hello World 的新手,也不服务已上 Kubernetes 的云原生老手,而是给那些正在把遗留系统迁向 Java 21、每天和--enable-preview、--add-exports、jlink打交道的中坚开发者——装对了,省三天排错;装错了,你得重装整个构建链路。
2. 下载与校验:认准官方构建源,绕开第三方打包黑匣子
OpenJDK 21 是 LTS 版本,但它的二进制分发并非只有“一个官方”。不同构建商(如 Eclipse Temurin、Amazon Corretto、Microsoft Build of OpenJDK、Adoptium)对 Windows x64 的支持粒度、JVM 参数默认值、调试符号包含、甚至jpackage工具链完整性都存在差异。我们本次选用Eclipse Temurin 21.0.4+7 (2024-07-16),理由很实在:它是 Adoptium 项目当前主推的 Temurin 构建线,通过 OpenJDK TCK 认证,且 Windows x64 版本完整包含jmods、jpackage、jfr、jcmd全套工具,同时提供.zip(免安装)与.msi(注册表集成)两种格式——后者对 CI/CD 自动化更友好,前者更适合多 JDK 版本共存的开发机。
2.1 官方下载地址与文件识别
进入 Eclipse Temurin 官网下载页 (注意:不是 GitHub Releases 页面,那是源码),按以下路径操作:
- 在页面顶部选择:Java Version → 21
- Operating System → Windows
- Architecture → x64
- Package Type → ZIP(推荐开发机)或MSI(推荐 CI/CD 或需系统级集成)
你会看到类似这样的文件名(截至 2024 年 8 月最新):OpenJDK21U-jdk_x64_windows_hotspot_21.0.4_7.zip
或OpenJDK21U-jdk_x64_windows_hotspot_21.0.4_7.msi
提示:文件名中
U表示 “Update”,jdk表示 JDK(含 JRE),x64_windows明确架构与系统,hotspot是 JVM 实现,21.0.4_7是完整版本号(21.0.4 是 GA 版本,7 是构建号)。务必核对这串字符,避免下载成jre(无编译器)、aarch64(ARM64,Windows x64 无法运行)或21.0.3(旧版,缺少 21.0.4 的关键安全补丁)。
2.2 SHA256 校验:为什么这一步不能跳?
Temurin 页面会为每个文件提供 SHA256 哈希值。下载完成后,必须校验。Windows 自带certutil即可完成:
# PowerShell 中执行(路径替换为你实际存放 zip 的位置) certutil -hashfile "C:\Downloads\OpenJDK21U-jdk_x64_windows_hotspot_21.0.4_7.zip" SHA256输出类似:
SHA256 hash of C:\Downloads\OpenJDK21U-jdk_x64_windows_hotspot_21.0.4_7.zip: a1b2c3d4e5f6...(共 64 位十六进制字符) CertUtil: -hashfile command completed successfully.将此结果与官网页面对应文件旁的 SHA256 值逐字符比对。哪怕只差一位,也说明文件损坏或被篡改——常见于断点续传失败、浏览器插件劫持下载、公司代理缓存污染。我见过三次因校验跳过导致java.exe启动即崩溃,最后发现是 zip 解压后bin\java.exe文件大小比正常值少 12KB。
2.3 解压与目录结构确认
若使用 ZIP 包,解压到一个无中文、无空格、路径层级尽量浅的位置,例如:
C:\dev\jdk-21.0.4\解压后检查核心目录是否存在:
| 路径 | 必须存在 | 用途说明 |
|---|---|---|
C:\dev\jdk-21.0.4\bin\ | ✅ | java.exe,javac.exe,jlink.exe等可执行文件 |
C:\dev\jdk-21.0.4\jmods\ | ✅ | 模块化系统所需.jmod文件(jlink依赖) |
C:\dev\jdk-21.0.4\lib\ | ✅ | tools.jar(已移除,但jmods替代)、jvm.cfg等 |
C:\dev\jdk-21.0.4\conf\ | ✅ | security\java.security等配置文件(TLS/加密策略可调) |
注意:Temurin 21 不再提供
jre/子目录(JDK 9+ 统一模型),所有运行时能力均内置于bin/和jmods/。若你看到jre/目录,说明你下载的是旧版 JDK 8/11 的“JDK + JRE”双目录结构,立刻停用。
3. 环境变量配置:PATH 与 JAVA_HOME 的生死线
Windows 下 JDK 生效与否,90% 取决于两个环境变量是否精准、是否被其他 JDK 覆盖。这里没有“差不多就行”,只有“全字符匹配才安全”。
3.1 设置 JAVA_HOME:指向根目录,不带 bin/
这是最常翻车的第一步。JAVA_HOME必须指向 JDK 解压后的根目录,且结尾不能有\bin。错误示范:
❌ JAVA_HOME = C:\dev\jdk-21.0.4\bin ← 错!bin 是可执行目录,不是 JDK 根 ❌ JAVA_HOME = C:\dev\jdk-21.0.4\ ← 错!末尾反斜杠在某些脚本中引发路径拼接错误 ✅ JAVA_HOME = C:\dev\jdk-21.0.4 ← 对!纯路径,无尾部斜杠设置方法(以 Windows 10/11 图形界面为例):
- 右键“此电脑” → “属性” → “高级系统设置” → “环境变量”
- 在“系统变量”区域,点击“新建”
- 变量名输入:
JAVA_HOME - 变量值输入:
C:\dev\jdk-21.0.4(请替换成你的真实路径,绝对不要复制粘贴本行,务必手动输入或从资源管理器地址栏复制纯路径) - 点击“确定”保存
逻辑说明:
JAVA_HOME是供 Maven、Gradle、IDE、Shell 脚本等工具自动定位 JDK 的“权威路径”。它们内部会拼接$JAVA_HOME\bin\java.exe来调用。如果JAVA_HOME末尾带\bin,拼接后变成C:\dev\jdk-21.0.4\bin\bin\java.exe,必然报错。
3.2 配置 PATH:把 %JAVA_HOME%\bin 放在最前面
PATH 决定了命令行敲java时系统找哪个java.exe。顺序至关重要——Windows 按 PATH 中路径从左到右搜索,第一个匹配的java.exe被执行。
- 在“系统变量”中找到
Path,点击“编辑” - 点击“新建”,输入:
%JAVA_HOME%\bin - 将这一行拖拽到 PATH 列表的最顶端(不是随便加在末尾!)
- 点击“确定”保存
参数说明:
%JAVA_HOME%\bin是动态引用,比硬编码C:\dev\jdk-21.0.4\bin更健壮。当未来升级 JDK 时,只需修改JAVA_HOME值,PATH 自动生效。但前提是JAVA_HOME必须已正确定义(见 3.1)。
3.3 验证环境变量是否生效
打开全新的命令提示符(CMD)或 PowerShell(重要:旧窗口不会读取新变量!),执行:
echo %JAVA_HOME%应输出:C:\dev\jdk-21.0.4
再执行:
where java应输出唯一一行:C:\dev\jdk-21.0.4\bin\java.exe
如果where java返回多行,说明 PATH 中有多个 JDK 的bin目录,且你的JAVA_HOME\bin没有置顶;如果返回“信息: 找不到文件”,说明JAVA_HOME未定义或 PATH 未包含%JAVA_HOME%\bin。
4. 常见问题排查:那些让你怀疑人生的报错,其实都有固定解法
装完 JDK,java -version显示正常,不代表万事大吉。真实项目中,90% 的“JDK 21 不工作”问题,出在环境变量、权限、或 JVM 参数冲突上。以下是我在某高校实验室部署 200+ 台学生机、某公司 CI 流水线维护中踩出的血泪经验,每一条都对应一个真实报错。
4.1 现象:java -version正常,但mvn compile报错Unsupported class file major version 65
- 原因:Maven 使用的
JAVA_HOME与命令行不一致。Maven 会读取自身启动脚本中的JAVA_HOME,或 Windows 系统变量,但某些 IDE(如旧版 IntelliJ)或批处理脚本会覆盖它。major version 65是 Java 21 的 class 文件版本号,说明编译器(javac)是 21,但 Maven 调用的java运行时却是旧版(如 JDK 17),导致无法加载新字节码。 - 解决:在 Maven 项目根目录下执行
mvn -v,检查输出中的Java version是否为21.0.4。若不是,在MAVEN_OPTS环境变量中强制指定:
或在set MAVEN_OPTS=-Djava.home="%JAVA_HOME%"maven\conf\settings.xml中添加:<profiles> <profile> <id>jdk21</id> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <maven.compiler.release>21</maven.compiler.release> </properties> </profile> </profiles>
4.2 现象:IDEA 中新建 Java 21 项目,java.lang.Thread.ofVirtual()编译报红,提示“Cannot resolve symbol”
- 原因:IDEA 默认使用内置的
java-compiler,但未启用预览功能(Virtual Threads 是预览特性,直到 JDK 21u 仍需显式开启)。且项目 SDK 配置可能未真正绑定到你刚装的 JDK 21。 - 解决:
File → Project Structure → Project:确认Project SDK选中17.0.4 (Temurin)(显示名称可能略有不同,但路径必须是C:\dev\jdk-21.0.4)File → Project Structure → Modules → Sources:确认Language level设为21 (Preview) - Sealed types, Pattern Matching for switch, Virtual Threads- 在
pom.xml中添加编译插件配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>21</source> <target>21</target> <compilerArgs> <arg>--enable-preview</arg> </compilerArgs> </configuration> </plugin>
4.3 现象:运行jpackage --name MyApp --input target/ --main-jar app.jar报错Error: Unknown option: --name
- 原因:
jpackage工具在 JDK 14 引入,但 Windows x64 的完整支持直到 JDK 17+ 才稳定。Temurin 21 的jpackage依赖jmods和bin\jpackage.exe,若解压时权限不足(如解压到Program Files需管理员),或jmods\目录缺失,jpackage会退化为一个空壳。 - 解决:
- 检查
C:\dev\jdk-21.0.4\jmods\是否存在且非空(应有java.base.jmod等数十个文件) - 用管理员权限打开 CMD,执行:
若输出帮助信息,说明工具正常;若报错,尝试重新解压到C:\dev\jdk-21.0.4\bin\jpackage --helpC:\dev\(避开 UAC 保护目录) jpackage生成的.exe默认依赖jre,若要生成免安装包,需额外参数:jpackage --name MyApp --input target/ --main-jar app.jar --win-console --runtime-image target\image
- 检查
4.4 现象:Spring Boot 3.2 应用启动时报java.lang.NoClassDefFoundError: java/lang/Thread$Builder
- 原因:Spring Boot 3.x 要求 JDK 17+,但部分 Starter(如
spring-boot-starter-webflux)在 JDK 21 下需额外模块导出。Thread.Builder是 Java 21 新增 API,但默认模块图未对其开放。 - 解决:在
application.properties或启动脚本中添加 JVM 参数:
或在--add-exports java.base/java.lang=ALL-UNNAMED --add-exports java.base/java.util=ALL-UNNAMEDpom.xml的spring-boot-maven-plugin中配置:<configuration> <jvmArguments> --add-exports java.base/java.lang=ALL-UNNAMED --add-exports java.base/java.util=ALL-UNNAMED </jvmArguments> </configuration>
5. 验证与实战:用三个真实命令,确认你的 OpenJDK 21 真正就绪
装完 JDK,别急着写代码。真正的验证,是让 JDK 做三件它最该做的事:正确识别自身、成功编译 Java 21 特性代码、并运行一个带预览特性的最小服务。这比java -version多走三步,但能提前暴露 95% 的隐性问题。
5.1 第一步:深度验证java -version与javac -version
打开全新 CMD,执行:
java -version javac -version理想输出(注意细节):
openjdk version "21.0.4" 2024-07-16 OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7) OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7, mixed mode, sharing)javac 21.0.4关键点检查:
openjdk version后是"21.0.4"(带引号,精确匹配)build 21.0.4+7中的+7是构建号,证明你装的是最新更新版64-Bit Server VM明确标识 x64 架构,非Client VM(已废弃)或32-Bitmixed mode, sharing表示 JVM 启用了类共享(Class Data Sharing),提升启动速度
若javac -version输出1.8.0_391,说明PATH里还有旧 JDK 的bin,且排在你新 JDK 前面——回到 3.2 重新检查where java和where javac。
5.2 第二步:编译并运行一个 Java 21 预览特性 Demo
创建一个测试文件VirtualThreadDemo.java:
// VirtualThreadDemo.java public class VirtualThreadDemo { public static void main(String[] args) throws Exception { // Java 21 Virtual Thread 示例 Thread vt = Thread.ofVirtual().unstarted(() -> { System.out.println("Hello from Virtual Thread! ID: " + Thread.currentThread().threadId()); }); vt.start(); vt.join(); // 等待虚拟线程结束 // Java 21 Pattern Matching for switch Object obj = "Hello"; String result = switch (obj) { case String s -> "It's a string: " + s; case Integer i -> "It's an integer: " + i; default -> "Unknown type"; }; System.out.println(result); } }在 CMD 中编译并运行:
javac --enable-preview --release 21 VirtualThreadDemo.java java --enable-preview VirtualThreadDemo逻辑说明:
--enable-preview是运行预览特性的强制开关;--release 21确保编译器生成兼容 JDK 21 运行时的字节码(而非依赖高版本 API)。若编译成功且输出两行内容(虚拟线程 ID 和字符串结果),说明javac和java均正确指向 JDK 21,且预览特性通道畅通。
5.3 第三步:用jdeps分析模块依赖,验证模块化完整性
jdeps是 JDK 21 的静态分析工具,能检测类对 JDK 模块的依赖。运行:
jdeps --module-path "%JAVA_HOME%\jmods" --add-modules ALL-SYSTEM VirtualThreadDemo.class预期输出应列出java.base等核心模块,并无not found或requires not found报错。若报错Error: Unable to access jarfile jmods/,说明jmods路径错误或缺失——回到 2.3 检查解压完整性。
5.4 进阶验证:生成一个最小可执行 JAR 并运行
用jlink创建一个仅含java.base的自定义运行时镜像(验证jlink和jmods):
jlink --module-path "%JAVA_HOME%\jmods" --add-modules java.base --output myjre myjre\bin\java -version应输出与之前一致的 JDK 21 版本信息。这证明jmods完整、jlink可用、自定义 JRE 生成成功——这是 GraalVM 原生镜像、容器化部署的基础能力。
从那以后我每次在新机器上装 JDK,都强制走一遍这三步验证:java/javac -version看基础、--enable-preview看特性、jlink/jdeps看模块化。不是为了炫技,而是因为曾经有次跳过jlink验证,上线后发现jpackage生成的 EXE 在客户机上闪退,查了两天才发现是jmods解压时被杀毒软件拦截,导致jlink静默失败。希望帮到你。
本文还有配套的精品资源,点击获取