OpenJDK 21升级到25需过三关:环境变量不冲突、构建工具兼容(Maven≥3.9.6/Gradle≥8.8)、代码无废弃API(如SecurityManager);Java 25是2025年9月发布的LTS版本,强制要求字节码版本66、显式配置maven.compiler.release=25,并需IDE分层适配虚拟线程等新特性。

直接说结论:OpenJDK 21 升级到 25 不是“换个包重启就行”,核心要过三关——环境变量不冲突、构建工具兼容、项目代码无废弃 API 调用。Java 25 是 2025 年 9 月发布的 LTS 版本,但它的早期构建(EA)阶段就已移除 SecurityManager 相关类,且强制要求 Maven ≥3.9.6、Gradle ≥8.8,这些细节不提前处理,mvn compile 或 IDE 启动时大概率报错。
确认 JDK 25 安装路径与 JAVA_HOME 是否干净
很多人升级失败,第一眼看不出问题,其实是 JAVA_HOME 指向了旧版本残留目录,或者 PATH 里混着多个 bin 路径。Java 25 要求解压后路径不含空格和中文,且不能和旧 JDK 共用同一目录(比如把 jdk-25 解压进 D:\Java\jdk-21 文件夹里会覆盖)。
- 先执行
where java(Windows)或which java(Linux/macOS),看实际调用的是哪个java可执行文件 - 再检查
echo %JAVA_HOME%或echo $JAVA_HOME,确保它和where java返回的父目录一致 - 如果用多版本共存方案(如
D:\Java\jdk-25),务必在设置JAVA_HOME前删除旧版本的注册表项(Windows)或/etc/profile.d/java.sh中重复定义(Linux) - 验证命令必须同时跑通:
java -version和javac -version,两者输出都得含25.开头的版本号,缺一不可
检查 Maven/Gradle 是否支持 Java 25 字节码
Maven 3.9.5 及以下版本无法识别 Java 25 的 class 文件格式,会直接报 Unsupported class file major version 66(66 是 Java 25 的字节码主版本号)。Gradle 8.7 及以下同理,会卡在 Could not determine the dependencies of task ':compileJava'。
- Maven:运行
mvn -v,确认输出中Apache Maven版本 ≥3.9.6;若不足,去 maven.apache.org 下载新版,替换MAVEN_HOME目录 - Gradle:运行
gradle --version,确认Gradle 8.8+;老项目用 wrapper 的,执行./gradlew wrapper --gradle-version 8.8 - pom.xml 中必须显式声明编译目标:
<maven.compiler.release>25</maven.compiler.release>,不能只靠source/target,否则可能漏掉模块系统校验
扫描并清理被移除的 API(尤其是 SecurityManager)
Java 25 正式移除了 SecurityManager 及其全部配套类(AccessController、Policy、ProtectionDomain 等),不是弃用(@Deprecated),而是彻底删源码。任何直接 import 或反射调用都会编译失败,错误信息通常是 package java.lang.SecurityManager does not exist。
- 全局搜索项目:
grep -r "SecurityManager\|AccessController\|Policy" . --include="*.java"(Linux/macOS)或用 IDEA 的Find in Path搜关键词 - Spring Boot 项目特别注意:旧版
spring-boot-starter-security依赖中可能隐含对SecurityManager的间接引用,需同步升级到 Spring Boot 4.x(对应 Spring Security 6.3+) - 若项目确实依赖沙箱机制,替代方案只有两类:用 JVM 启动参数
-Djava.security.manager=allow(仅限调试),或重构为基于java.lang.RuntimePermission的细粒度策略(生产不推荐)
IDE 配置必须分层更新,不能只改 Project SDK
IntelliJ IDEA 或 Eclipse 里只改 Project Settings → Project SDK 是最常见误区。Java 25 的语法特性(如增强的模式匹配、虚拟线程构造语法 Thread.ofVirtual())需要 IDE 的语言级别、编译器设置、甚至构建代理(Build Process VM)全部对齐。
- 先在
File → Project Structure → Platform Settings → SDKs里新增 JDK 25(指向你解压的真实路径),不能复用旧 SDK 条目 - 再进
Project Settings → Project,把 Project SDK 切成刚注册的 JDK 25,并把Project language level设为25 (Preview) - Virtual threads, Pattern Matching - 每个 Module 进入
Dependencies标签页,确认Module SDK也选了 JDK 25(别依赖继承) - 最后进
Settings → Build → Build Tools → Maven → Importing,把JDK for importer也设为 JDK 25,否则 Maven 导入时仍用旧 JDK 解析 pom
最容易被忽略的一点:Java 25 默认启用虚拟线程的预览特性,但 IDE 的 Run Configuration 里默认没开 --enable-preview。如果你写了 Thread.ofVirtual().start(...) 却报 java.lang.UnsupportedOperationException: Virtual threads are not supported,八成是忘了在 Run → Edit Configurations → VM options 里加这行。


















