JDK25已来,为何大多公司仍在JAVA8?
文章目录
第一章:JDK 25 都发了,为什么大家还在 Java 8
JDK 25 发布那天,我特意去看了一眼发布说明。内容不复杂,新特性不少,语气一如既往地克制,像是在告诉你:
“你可以升级了,但我们不催。”
这种感觉我在 Java 世界里已经很熟了。
同一天,Python 社区的画风完全不一样。Python 3.13 的兼容性讨论、弃用警告、生态适配进度,被反复拿出来说。很多库会直接写在 README 里:“Python 3.8 即将停止支持,请尽快升级。”Java 这边没有这种集体施压。JDK 25 发布了,但 JDK 8 依然能跑、能用、能上线。
我翻了下手头几个线上系统的运行环境,结果并不意外:
- 老核心系统:Java 8
- 偏边缘的新服务:Java 11
- 真正用到 17 的,只有少数新项目
- 至于 21、25,基本只存在于 PPT 和技术分享里
这不是个别现象。招聘网站、云厂商镜像、监控 SDK 默认支持版本,几乎都在默默告诉你一件事:Java 8 依然是“安全版本”(你发任你发,我用java8)。这和 Python 的升级节奏形成了非常明显的反差。
Python 2 → 3,是一次不升级就活不下去的断代。Java 8 → 25,更像是一次你可以一直不动的演进。
从技术角度看,Java 明明一直在进化:
- 语言层面:var、record、sealed class
- JVM 层面:GC、JIT、内存模型
- 工程层面:模块化、工具链
但这些变化,没有哪一项是“非升不可”。
我见过不少 Java 服务,代码风格停在 2016 年,但稳定运行到今天。也见过 Python 项目,因为一个依赖不再支持旧版本,被迫整体升级。
这两种生态的差异,很早就写在设计选择里了。
Java 的向后兼容是它的优势。但到了 JDK 25 这个时间点,这个优势开始变得有点微妙。
因为问题已经不是:
JDK 8 能不能用?
而变成了:
如果一直停在 JDK 8,到底是在保守,还是在逃避某些成本?
这个问题,在技术会议上很少被正面讨论。更多时候,它会被一句话带过:
“先别动,风险太大。”
可风险到底在哪?为什么 Python 升级时大家骂归骂,还是会跟着走;而 Java 这边,哪怕官方已经跑到 25,企业却依然集体停在 8?
我后来发现,真正卡住升级的,从来不是新特性本身。而是升级这件事,一旦开始,就很难只停在“换个 JDK”上。但这件事,只有在你真的尝试过一次升级之后,才会意识到。
第二章:升级 JDK,看起来向下兼容,实际上并不“平滑”
很多人对 Java 升级的第一判断,来自一个几乎写进 DNA 的认知:
Java 是强向下兼容的语言。
这句话本身没错,也是大多数人从jdk7到jdk8无缝升级的真实感受。但问题在于,大多数人只把它理解成了语法层面。
你用 Java 8 写的代码,放到 JDK 17、21、25 上,大概率还能编译。for、try-catch、Stream、lambda,一个都不会少。这也是为什么很多升级评估一开始都显得非常乐观。真正的问题是 Java 的“向下兼容”,从来不等于 JVM 的平滑迁移。
第一次认真推进 JDK 升级时,我们的目标设得非常保守:不引入新语法、不改业务逻辑、不升级框架,只把运行时从 Java 8 换成 17。理论依据也很充分:代码是向下兼容的,JVM 只要能跑就行。
结果第一个暴露问题的,不是业务代码,而是 JVM 本身。
从 JDK 9 开始,Java 做了一次非常激进、但长期看又必须要做的事情:模块化(JPMS)。这一步,本质上是在重塑 JVM 的边界。在 Java 8 之前,JDK 更像是一个“开放的整体”。JDK 自己的内部实现,和应用代码之间,并没有严格的隔离。于是很多框架、工具、甚至业务代码,都默认了一件事:
JVM 内部的类,我是可以摸得到的。
比如反射。
Field field =String.class.getDeclaredField("value"); field.setAccessible(true);在 Java 8,这是一个非常常见、甚至被大量框架