楼层: 首页/ 软件技术/ JavaEE / Jakarta EE/ 最新版本与兼容性:Jakarta EE 10/11 + Tomcat 10/11 怎么选
v

最新版本与兼容性:Jakarta EE 10/11 + Tomcat 10/11 怎么选

Jakarta EE Releases · Servlet Version Matrix · javax → jakarta

Java Web 的版本号比 Java 本体还乱——你看到的 javax.servlet 和 jakarta.servlet 之争,本质就是版本绑定关系。下面这张矩阵一次说清:Jakarta EE 版本、Servlet 版本、Tomcat 大版本,三者强绑定,不能乱搭。

规范版本发布时间包名定位
Jakarta EE 112024jakarta.*最新版。CDI 4.1、Servlet 6.1、JPA 3.2、Jakarta REST 3.1。要求 JDK 17+。
Jakarta EE 102022jakarta.*当前稳定主力。CDI 4.0、Servlet 6.0、JSP 3.1、JPA 3.1。Tomcat 10.1 对应这个版本。
Jakarta EE 9.12021jakarta.*第一次全面改包名,从 javax 迁到 jakarta。
Java EE 82017javax.*最后一个 javax 版本。Tomcat 9 对应它。老项目、Spring Boot 2.x 用。

Servlet 容器版本矩阵:Tomcat / Jetty / WildFly

容器对应 EE 版本Servlet 版本用在哪
Tomcat 11.xJakarta EE 11(Web Profile)Servlet 6.1最新,新项目尝鲜。要求 JDK 21+。
Tomcat 10.1.xJakarta EE 10(Web Profile)Servlet 6.0本页基线。当前学习和生产最稳。要求 JDK 11+。
Tomcat 9.xJava EE 8 / Jakarta EE 8Servlet 4.0老项目,包名是 javax.*。
Jetty 12.xJakarta EE 10+Servlet 6.0+轻量嵌入式,Spring Boot 内嵌可选。
WildFly 33/34完整 Jakarta EE 10/11Servlet 6.0/6.1Red Hat 出品,全功能 Java EE 容器(EJB、JPA、CDI 全家桶)。初学不用。

javax → jakarta 迁移史:为什么包名要改

论这段历史的来龙去脉

2017 年:Oracle 把 JavaEE 捐给 Eclipse 基金会,但"Java"是注册商标,不能随便用。2019 年改名 Jakarta EE。

关键一刀:Java EE 8(2017)是最后一个用 javax 包名的版本。从 Jakarta EE 9(2021) 起,所有 javax.servlet.*、javax.persistence.* 包名强制改成 jakarta.servlet.*、jakarta.persistence.*。

为什么是强制改而不是兼容:如果保留 javax 包名,就和 Oracle 自己维护的 javax EE 包冲突,两个 jar 里同名类互相覆盖。Eclipse 基金会干脆换个根包名,一刀两断。

你看到的包名该用哪个容器 / 框架
javax.servlet.*Tomcat 9、Spring Boot 2.x、Java EE 8 老项目。
jakarta.servlet.*Tomcat 10+、Spring Boot 3.x、Jakarta EE 9+ 新项目。本页基线。

Spring Boot 版本绑定:别乱搭

Spring BootJDK 要求包名内嵌 Tomcat
Spring Boot 3.xJDK 17+jakarta.*Tomcat 10.1 / 11
Spring Boot 2.7.xJDK 8+javax.*Tomcat 9
混包名 = 编译报错

Tomcat 10 下写 import javax.servlet.http.*,编译直接找不到类。Tomcat 9 下写 import jakarta.servlet.*,一样找不到。包名和容器大版本强绑定,别照抄网上老教程。本页所有代码按 Tomcat 10.1 + Jakarta EE 10 写 jakarta.*。