
Platform Base · JDK 25
一次按「平台底座换代」立项的全栈升级。它同时回答四个问题:为什么是 JDK 25 这个 LTS、它到底强在哪、国内 Linux 是否撑得住、以及 ooderAgent 底座换装后得到了什么、怎么安全地切过去。
LTS 换代 · JDK 25 GA 2025-09-16
框架 · Spring Boot 2.7 → 3.5.x
迁移 · javax → jakarta
策略 · 框架/运行时解耦 · 灰度可回滚
摘要
当一个平台已经在生产运行多年,「换 JDK」从来不是一个版本号问题,而是一次涉及框架、依赖、类加载链与部署拓扑的系统性工程。
ooderAgent 平台此前的真实状态,是三条相互咬合的技术债:上游已 EOL、JDK 基线三套分裂、国产化运行环境已成事实。把它们放在一起看,会发现一个结论:继续在 JDK 11 + Spring Boot 2.7 上修修补补,成本已经高于一次性换代。
现状痛点 | 直接后果 |
|---|---|
Spring Boot 2.7.18 / Spring 5.3.32 | OSS 支持已于 2023-11-24 终止,安全补丁不再回归——这是合规级风险,不是性能问题 |
JDK 基线三套并存(11 / 21 / 25) | 根构建靠 profile 隔离;桌面端被隔离在 -Pdesktop 外无法参与全量聚合构建;30+ / 15+ 处脚本硬编码 JDK 路径 |
「上 JDK」等价于「上 Boot 3」 | Spring 5.3.x 内置 ASM 无法解析高版本 class、cglib 不支持强封装 ⇒ 平台连 JDK 21 都跑不起来,JDK 25 差距更大 |
生产已跑在国产 Linux + 国产 CPU | 麒麟 aarch64、x86_64 多节点并存,运行时换代必须适配信创栈 |
本文的立场:这次升级的正确立项口径是「平台底座换代」——运行时(JDK 25)+ 框架(Spring Boot 3.5.x / jakarta)+ 工程基线(单一日线)三件事一起做,但在实施与灰度上必须解耦(见第 06 章)。
Java 的 LTS 节奏决定了企业栈的换代周期。JDK 25 是继 JDK 21 之后的下一个长期支持版本,也是多个多年期项目(Loom / Amber / Leyden)的集大成落地。
事实 JDK 25 于 2025 年 9 月 16 日正式 GA(General Availability),是 Java SE Platform 版本 25 的参考实现(openjdk.org/projects/jdk/25,JSR 400)。作为 LTS,其官方 premier 支持延续到 2030 年 9 月前后,并另有延伸支持选项——这正好覆盖一个平台 4–6 年的服役周期。
事实 本版共落地 18 项 JEP(实验性 1 项、孵化 1 项、预览 4 项,其余转为永久特性)。这不是一次零敲碎打的迭代,而是把并发模型(Loom)、语言表达力(Amber)、启动/镜像(Leyden)三条主线的多年投入一次性转正。
LTS 换代的经济学:JDK 21 的 premier 支持窗口有限,生态正在向 JDK 25 迁移——例如 Ubuntu 26.04 LTS 已宣布默认搭载 OpenJDK 25 取代 OpenJDK 21。对企业而言,在下一个 LTS 上定型,意味着未来数年不用再为「追非 LTS 版本」反复付出迁移成本。
主线 | 代表特性 | 对企业平台的意义 |
|---|---|---|
并发(Loom) | 虚拟线程(JEP 444 + 491)、结构化并发、Scoped Values(作用域值) | IO 密集型服务(网关/SSE/LLM 调用)用「一请求一线程」的简单模型拿到高并发吞吐,而不再依赖复杂的异步编排 |
启动/镜像(Leyden) | AOT Cache(JEP 483 类加载链接、514 命令行人体工程学、515 方法剖析) | Fat-jar / 容器化服务的冷启动显著加速,直接改善弹性扩缩与故障恢复时间 |
语言(Amber) | 模式匹配、紧凑源文件与实例主方法(JEP 512)、模块导入声明(JEP 511)、灵活构造函数体 | 样板代码更少,可维护性提升;单文件脚本化能力便于运维工具与自检脚本 |
下面这些不是「新玩具」,而是直接影响一个多实例、IO 密集、常驻内存平台的关键能力。
虚拟线程(JEP 444 在 JDK 21 转正,JDK 25 延续并补强,JEP 491 消除固定/协调)让 JVM 可以廉价地创建百万级线程。对 ooderAgent 这种SSE 长连接、LLM 阻塞调用、A2A 跨节点委托密集的平台,意味着可以用最直观的阻塞式写法获得高吞吐,而不必把整条链路改成反应式。Scoped Values(作用域值)作为 ThreadLocal 的替代,能在父子线程间共享不可变数据且时空成本更低,与虚拟线程是天然搭档。
JEP 483/514/515 组成的 AOT Cache 让类加载、链接与方法剖析可以提前固化。平台有 11 个 fat-jar 服务 / 10+ 实例,冷启动速度直接决定弹性扩缩与故障恢复体验——这是本次升级中「高度可量化」的一块 判断(具体收益数字见第 07 章诚实口径)。
JEP 470 引入密码学对象(密钥/证书/CRL)的 PEM 编解码 API(预览),并纳入后量子算法——对企业级平台的密钥/证书管理与等保合规是实质利好。
与平台能力的映射:虚拟线程 → SSE/LLM/A2A 阻塞链路吞吐;AOT Cache → 11 个 fat-jar 冷启动;紧凑对象头 → 常驻堆下降;分代低停顿 GC → 长稳服务;PEM/后量子 → 密钥与合规。每一条都对应平台的一类真实负载,而非纸面参数。
「换不换 LTS」的一个隐性门槛是国产运行环境撑不撑得住。答案是:JDK 25 已在国内主流芯片 + 操作系统上形成可用矩阵。
事实 JDK 25 GA 后,国产芯片与操作系统社区迅速跟进,主流组合均有对应构建或适配:
CPU 架构 | JDK 25 供应 | 操作系统 / 说明 |
|---|---|---|
龙芯 LoongArch64 | 龙芯开源社区 提供 JDK 25(tar/deb/rpm,发行注记 2025-09-23) | Loongnix 20 / Loongnix serve;兼容 Linux 4.19 内核 UAPI |
鲲鹏 aarch64 | openEuler 22.03 LTS 官方 GA 构建,全功能 | 华为毕昇 OpenJDK 25 GA 亦可用 |
飞腾 / 海光 / 兆芯 / 申威 | 社区/厂商构建 | openEuler / 统信 UOS / 麒麟 V10 SP1;申威 SW64 多为实验性(禁 ZGC/JFR) |
x86_64 | 官方 GA | openEuler / UOS / 麒麟 / 开放麒麟 openKylin 通用 |
对 ooderAgent 的意义:生产已在麒麟 aarch64与 x86_64 多节点运行,且教育版外网、8098 form-agent 已在 Kylin aarch64 / systemd 实机上完成 JDK 25 + Spring Boot 3.5.3 升级验证——国产 Linux 不是升级的阻力,而是已被验证的落地面。
换装完成后,平台拿到的不是「更快一点的同一个东西」,而是一组结构性收益。
三套基线(11/21/25)归一为 JDK 25,根 POM 以 maven.compiler.release=${java.version} 单键真源收口;为绕过 JDK 不一致而存在的 -Pdesktop profile 可删除;50+ 处脚本 JDK 路径硬编码可收敛。判断 这是全部收益里最「确定」、最少争议的一块。
从已 EOL 的 Spring Boot 2.7.18 迁到 Spring Boot 3.5.3(jakarta),重新获得上游安全维护。javax→jakarta 迁移约 177 处 import(需白名单,见第 06 章),是本工程量的主体。
能力 | 来源 | 平台受益面 |
|---|---|---|
冷启动加速 | AOT Cache(JEP 483/514/515) | 11 个 fat-jar 服务 / 10+ 实例的弹性与恢复 |
高并发吞吐/内存 | 虚拟线程(JEP 444 + 491) | SSE 长连接、LLM 阻塞调用、A2A 委托链路 |
堆占用下降 | 紧凑对象头(JEP 519) | 海量小对象的常驻内存 |
低停顿长稳 | 分代 Shenandoah / ZGC 分代 | 长驻服务 GC 停顿 |
ESB 扫描可控 | P6 包前缀白名单(ooder.esb.scan.include) | 避免 ESB 全量 defineClass 导致端口长时间不监听 |
这些是本博文少数可以标注为事实的落地证据,而非规划。
本方案最重要的设计决策,是把「框架迁移」与「运行时迁移」拆成两个独立变更,避免「一个巨型变更 + 一次全量停机」的高风险组合。

图 1 · 框架迁移与运行时迁移解耦:两类完全不同的故障域拆开,各自灰度、各自回滚。
框架迁完并在 JDK 21 上稳定后,运行时切 25 是独立小变更。但有几条本仓特有的坑必须处理:
# 平台件(Studio.jar)——两个必带参数
mvn -pl ooder-pro -am package -DskipTests -Dmdep.copy.skip=true
# -am:否则从 m2 取到 javax 旧 jar
# -Dmdep.copy.skip=true:不生成 target/lib(271 jar 会让 JDS 全目录扫描,启动数分钟)启动以 JDK 25 绝对路径 + 上述 --add-opens + -Dloader.path=lib,lib/domain,lib/biz 起灰度实例。
层 | 做法 |
|---|---|
坐标层 | Maven 坐标以 version 区分(1.0.j11 冻结只收 CVE / 2.0.j25 新基线),可用 ${revision} + flatten 插件一处切基线 |
构建层 | 两仓/两线,各自单一 JDK 基线 |
运行时层 | 每实例独立 jar + lib + SQLite db + 端口;8200+ 新端口段起灰度,生产零改动 |
资产层 | knowledge / templates / skills / static 抽成版本化制品,跨基线共享 |
结语:这次升级的价值,一半来自 JDK 25 的新特性,另一半来自「把三套混乱基线收敛成一条、把已 EOL 的上游换成有维护的上游」。前者让人兴奋,后者才让平台能在未来数年安全、可控地奔跑。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。