在学习SpringMVC的过程中发现,教学提供的项目怎么跑都是报错,检查后发现是因为版本不同导致的,一种解决方法是将Tomcat降低到10以下的版本,另一种不用修改Tomcat版本参考以下内容

报错内容

在web.xml文件中提示'org.springframework.web.servlet.DispatcherServlet' 未分配到 'javax.servlet.Servlet,jakarta.servlet.Servlet'

解决方法

在pom.xml中将以下依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

改成后重新加载maven项目

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
</dependency>

需要注意的是,重新加载maven项目后记得将代码中原来javax.*包名改为jakarta.*

原因

2017年8月,Oracle决定将Java EE移交给开源组织,最后由Eclipse基金会接受,但是要求开源组织不能再使用Java的名号,于是Eclipse通过投票选出了 "Jakarta EE"这个名称

也就是说,Java EE已经正式更名为Jakarta EE(雅加达),当然在这之前,Java EE还有另一个名字 "J2EE"

当然,不管名字怎么改,它们指的都是同一个东西"Java Platform, Enterprise Edition"

问题

所以这会带来的问题就是,在2017年之后的版本,所有原来为javax.*的命名空间都会改为jakarta.*,不只是Tomcat,其他的开源项目也都受到了影响,就拿Spring来说,Spring Framework 6 和 Spring Boot 3也都规定了最低的基线版本

  • Java 17+(Spring Framework 5.3.x 的基线是 Java 8-17)
  • Jakarta EE 9+(Spring Framework 5.3.x 的基线是 Java EE 7-8)

也就是说,大部分新版本都不会再支持javax.*而只能支持jakarta.*了,在实际的开发中,总不能一遇到问题就去降级版本,新技术能够带来更多的特征和更高安全性