内容提要
OpenJDK 21发布后,D瓜哥建议整体升级项目依赖,特别是Lombok和Netty。注意JDK 21移除了Java EE模块,需要引用相关Jar包。为解决编译和运行中的错误,需添加特定依赖和启动参数。使用Maven的profile机制可实现无痛升级,确保项目在不同JDK版本间平稳切换。
延伸解读
升级前的依赖检查与整体升级
文章建议在升级 OpenJDK 21 前,先使用 Maven 命令 mvn versions:display-dependency-updates 检查依赖可升级情况,并整体升级项目依赖。这能减少后续兼容性问题,尤其是 Lombok 和 Netty 必须升级到指定版本以上。但需注意,如果开发环境仍以 JDK 8 为主,Spring 不宜直接升到 6.x,可参考相关文章忽略特定版本升级。
Java EE 模块移除的应对措施
由于 JEP 320 在 JDK 11 中移除了 Java EE 和 CORBA 模块,升级到 JDK 21 后编译可能报错找不到 javax.annotation.Resource 等类。文章指出需要显式添加 jakarta.annotation-api 或 javax.annotation-api 依赖。同时,Nashorn JavaScript 引擎和 JAXB 也被移除,需分别添加 nashorn-core 和 jaxb-runtime 依赖。这些改动是升级过程中的常见障碍。
模块化封装与启动参数调整
JDK 9 引入的 Java 平台模块系统增强了封装性,可能导致运行时出现 InaccessibleObjectException。文章建议使用 --add-opens 参数开放所需模块,例如 --add-opens java.base/java.lang=ALL-UNNAMED。对于 Maven 构建和测试,还需在 maven-compiler-plugin 和 maven-surefire-plugin 中配置相应参数。IntelliJ IDEA 中也可通过 VM Option 添加。这些调整是确保应用在 JD
利用 Maven Profile 实现无感升级
为了兼顾 JDK 8 和 JDK 21 环境,文章推荐使用 Maven 的 profile 机制,根据 JDK 版本自动激活不同配置。例如,JDK 8 下使用 Spring 5 和 javax.servlet,JDK 21 下使用 Spring 6 和 jakarta.servlet,并添加必要的依赖和启动参数。这样,只要代码不直接依赖 Servlet API,就能在两种 JDK 间自由切换,实现平稳升级。此外,可借助 EMT4J 工具检查潜在问题。
Q&A
升级到 OpenJDK 21 时需要注意哪些依赖的版本?
Lombok 需升级到 v1.18.30+,Netty 建议升级到 4.1.93.Final+,Bean Validation 升级到 jakarta.validation-api 3.0.2 及 hibernate-validator 7.0.5.Final。
如何解决编译时找不到 javax.annotation.Resource 的问题?
需要添加相关的 Jar 包依赖,如 jakarta.annotation-api 或 javax.annotation-api。
OpenJDK 21 移除了哪些模块?
OpenJDK 21 移除了 Java EE 模块,因此需要引用相关的 Jar 包。
如何使用 Maven 的 profile 机制实现无痛升级?
可以根据 JDK 版本自动激活不同的配置,确保项目在不同 JDK 版本间平稳切换。
在 JDK 21 中,如何处理 Java 模块化带来的访问错误?
可以使用 --add-opens 参数来解决访问错误,确保模块对外开放。
升级到 OpenJDK 21 后,如何检查项目中的潜在问题?
可以使用阿里巴巴开发的 Migration Toolkit for Java 来检查 JDK 升级中的问题。