先说一个可以自己验证的事实:Spring Boot3.5.16发布于 2026-06-25,而 3.5.x 的 OSS 支持期在 2026-06-30 结束。中间隔了 5 天。这个日期不是我推的,是 Spring 官方 API 直接给的:curl-shttps://api.spring.io/projects/spring-boot/generations|jq._embedded.generations[] | select(.name3.5.x)# {# name: 3.5.x,# ossSupportEndDate: 2026-06-30,# commercialSupportEndDate: 2032-06-30# }而且这不是 Spring Boot 一条线的事。把官方 API 上全部项目的 generations 拉下来数一遍,ossSupportEndDate正好是2026-06-30的项目有46 个—— Spring Framework 6.2.x、Spring Security 6.5.x、Spring Cloud 2025.0.x、Spring Data JPA 3.5.x、Spring Batch 5.2.x、Spring Integration 6.5.x、Spring Session 3.5.x、Spring Kafka 3.3.x、Spring AMQP 3.2.x…它们的商业支持则一律到2032-06-30。一、为什么你没收到任何提醒因为 EOL 不产生 CVE 编号。Dependabot、OSV、各类 SCA 回答的是「你这个版本有没有已知漏洞」,不回答「你这个版本还会不会被修」。后者根本不在那套数据模型里 ——没有编号,没有 advisory,没有可供匹配的条目。其他几条你以为会提醒你的路径,也都不通:应用启动不打这个警告,Maven / Gradle 构建也不报。官方明确拒绝做这件事。spring-projects/spring-boot#45043提议给 Maven/Gradle 插件加 EOL 告警(扫org.springframework全部 jar,报哪些已 EOL、哪些还在商业支持窗口,warn / enforce 两档),2025-04-24 被关成status: declined。Spring Boot 维护者 wilkinsona 的原话是:consider it to beout of scopefor the Spring Boot project. To be effective, we believe suchnotifications would benefit from coveringmore than just theorg.springframework.*namespace.It would also require aremote servicethat can manage the EoL dates.IntelliJ IDEA 也没有。把 JetBrains Inspectopedia 的完整目录(7,369 个条目)拉下来搜一遍,Spring 相关的 49 条 inspection 全是 autowiring、SpEL 语法、bean 命名、Data repository 方法签名这类代码正确性检查,没有一条涉及版本支持期。还有一个容易搞混的地方:「还有 GA 版本」不等于「还在支持」。3.5.16是正经 GA 版本,现在去 Maven Central 一样下得到 —— 它只是最后一个。二、「OSS 支持结束」到底意味着什么(这一节我尽量不说过头)网上关于 EOL 的文章有个通病:把话说死,然后卖解药。所以这一节我只讲能量出来的东西。先说一个反例,它推翻了「断供了就没补丁」这种说法:Spring Security 5.7.x 的 OSS 支持 2023-06-30 结束。而 Maven Central 上:版本发布日距断供HTTP5.7.102023-07-1717 天2005.7.112023-09-1880 天2005.7.122024-03-18262 天2005.7.132024-10-21479 天2005.7.142024-11-18507 天200断供之后一年半,补丁还在公开发。所以「断供 立刻拿不到补丁」是假的。但也不能反过来说断供没影响。同期看 Spring Boot 的 3.0–3.5 六条线,无一例外:最后一个公开版本都发在断供日之前5~40 天。同一件事在不同项目上行为不同,所以「还会不会发版」这个判据本身就不可靠。换一个能量的判据。把 132 条 Spring 官方 GitHub advisory 拆成376 条「受影响版本区间」,按漏洞披露当天、该版本线是否已过 OSS 支持期交叉制表:披露时该线状态有修复版修复版为空合计仍在 OSS 支持期2180218已断供629615896 条「官方没给任何可升版本」的条目,100% 落在已断供的线上;仍在支持期的 218 条,一条都不缺。两个方向都没有反例。而且断供越久越难:断供 90 天内只有 8 条无修复版,满一年以上有 47 条。→ 断供后头三个月是「惯性窗口」,embargo 期先修好的补丁还在陆续放出来。所以结论只到这里:越过 OSS 支持期这条线之后,下次出洞时你拿不到修复版的概率显著变高。不是「已经拿不到了」。而且商业支持依然存在 —— 3.5.x 到 2032-06-30,还有六年。一个已经发生的样本GHSA-88fw-v6x4-3f58(high,2026-07-31 披露,在 6-30 断供之后一个月),同一条漏洞,三条 Spring Data Commons 版本线三种待遇:4.0.x(仍在支持期)→ 修复版4.0.63.5.x(2026-06-30 断供)→ 修复版3.5.12,但它发布于 2026-06-09,断供前 21 天 —— 赶上了末班车3.4.x(2025-12-31 断供)→first_patched_version为空。实测spring-data-commons:3.4.14在 Maven Central 上HTTP 404,公开渠道没有版本可升。3.4.x 的用户在六个月前站的位置,就是 3.5.x 用户现在站的位置。三、那怎么查自己中没中难点不在查日期,在于你未必知道自己实际装了哪些版本。pom.xml里绝大多数 Spring 依赖是不写版本号的(由 parent / BOM 统一管理),而真正打进产物里的是几十个模块 —— 包括你从没写过的传递依赖,比如spring-data-commons(上面那条 high 漏洞的主角,用任何 Spring Data 模块都会带上它)。所以我写了个小工具spring-eol-check:输入是构件,不是版本号。java-jarspring-eol-check.jar target/myapp.jar# fat jar:给出实际打进去的每个模块java-jarspring-eol-check.jar ./libs# 目录java-jarspring-eol-check.jar pom.xml# 也行,但只能判到 parent 那层输出长这样:读了 1 个文件,认出 8 个 Spring 构件: 8 个 —— OSS 支持已结束 ── OSS 支持已结束(8 个) ────────────────────── org.springframework.boot:spring-boot:3.5.16 版本线 3.5.x · OSS 支持至 2026-06-30(已过 41 天) 商业支持至 2032-06-30(仍在) 仍在 OSS 支持期的最近版本线:4.0.x(OSS 支持至 2026-12-31,还剩 143 天) ⚠️ 这条线本身也快到期了。若这次升级成本较高,可考虑直接上 4.1.x(OSS 支持至 2027-07-31) 发现于 app.jar!/BOOT-INF/lib/spring-boot-3.5.16.jar —— 依据:jar 文件名几个刻意的设计:单 jar、零运行时依赖、完全离线—— 判定表打包在 jar 里,运行时不联网、不上传任何东西。(运维手上一堆 jar 的场景,不可能往外传。)目标 Java 8。用它的人恰恰是「跑着老 Spring 的人」,Spring Boot 2.7.x 那一代大量部署在 Java 8 上;工具自己要求 Java 17 的话,最需要它的机器上根本起不来。退出码 0 / 1 / 2(全部在支持期 / 有 90 天内到期的 / 有已结束的),可以直接挂 CI。判定表从官方 API 生成,不手抄,带 13 条断言,包括与 endoflife.date 双源对比、正确性与完整性分别断言、以及带负对照的映射回测(不然「逢查必中」也能全过)。四、这个工具不做什么不判有没有 CVE。那是 Dependabot / OSV 的活,而它们不看 EOL —— 两件事互补,不是替代。不评估升级难度。它只告诉你日期,不告诉你 3.x → 4.x 有多痛。只覆盖org.springframework.*,不判第三方库。判定表有生成日期,过旧请更新版本。另外有一个免费的在线工具也能读pom.xml,该说清楚:endoflife.ai 的 Stack Scanner,免费、无需注册、在浏览器里跑。拿同一个 Spring Boot 2.7.18 的老项目pom.xml实测,它报出 0 条,本工具报出 3 条。差别是结构性的:它的解析只匹配dependency块(不读parent,而 Spring Boot 版本 99% 写在那儿)、排除${...}属性引用的版本、且它的包映射表里 Spring 只有spring-boot和spring-framework两个键 ——对不上spring-boot-starter-web这种真实 artifactId。它的数据源 endoflife.date 全库 462 个产品里,与 Spring 有关的也只有 4 个。如果你只想快速看一眼 Spring Boot 主版本,那个在线工具足够了。需要「实际打进产物的每个模块」「离线」「CI 退出码」时,再用我这个。仓库:https://github.com/xiaoqiMikko/spring-eol-check (Apache-2.0)判定表数据源:https://api.spring.io — 官方、机器可读。工具里没有一个日期是手抄的。