前言
JDK 升级对于 Java 应用来说是不得不面对的事情,一方面 Java 生态系统希望 Java 应用能跟上最新 JDK 版本:
-
Oracle 建议将 JDK 的 LTS 版本的发布周期从 3 年调整为 2 年,对于只使用 LTS 版本的应用来说,可以在更短时间内使用最新的技术,但这也意味着版本升级会更加频繁。
-
Spring Framework 6 只支持 JDK 17。Spring 是大多数企业级应用依赖的基础框架,意味着不得不升级到 JDK 17。
但是另一方面,现实中的 Java 应用的 JDK 升级较为缓慢。JDK 11 从 2018 年发布近 4 年,已升级 JDK 11 仍未达到半数(2022-state-of-java-ecosystem ) 。而相比之下,JDK 8 发布之后 1 年内可达到 38%,两年达到 64.3%,到 2018 年时近 80%(java-8-adoption-march-2016、jvm-ecosystem-report-2018)。
那为什么升级 JDK 11 积极性不高呢?
可能的原因是多方面的。例如 JDK 8 在语言层面引入了 Lambda 对开发人员非常有吸引力,而 JDK 11 在语言层面的更新显得可有可无。但是有一点是非常明显的,相比从其它版本升级到 JDK 8(JDK 6/7 升级到 JDK 8 对于应用基本无感 ), 升级到 JDK 11/17 难度会大很多,可能会遇到很多兼容性问题,如:
1、删除了一些 API 如 sun.misc.*导致代码出现 ClassNotFoundException。
2、Java Version 的 Schema 发生变化导致原来判断 Java 版本的逻辑出现异常。
3、用户代码中使用了私有的 API,使用了标记为废弃的 API 等。
4、JPMS(Java Platform Module System ) 的引入导致一些反射代码会无法工作。
5、删除了 J2EE 相关的包。
如果需要升级的应用依赖了成百上千的二方和三方