升级到tomcat 10,然后启动报错:java.lang.ClassNotFoundException: javax.servlet.ServletContainerInitializer

报错如下:

原因分析:这个问题的表象是javax.serlet依赖没有找到,而根本的原因是logback的ServletContainerInitializer接口实现和tomcat 10的ServletContainerInitializer接口有冲突。

logback的LogbackServletContainerInitializer实现接口类是javax.servlet.ServletContainerInitializer;

而tomcat 10的ServletContainerInitializer 实现接口类是jakarta.servlet.ServletContainerInitializer

 这两个接口明显不一样,如果强行载入就发生类转换异常ClassCastException:

 所以文章开头的错误实际上是因为logback找不到javax.servlet依赖造成的,但是如果注入javax.servlet依赖又会引发ClassCastException异常。

这个实际是由tomcat 10的servlet-api依赖的新标准决定的。

解决办法有三个:

1. 如果一定要用tomcat 10, 则必须删除logback依赖, 因为logback 1.3版本以下不能实现jakarta的ServletContainerInitializer接口

2.  将logback升级1.4以上,因为logback1.4以上可以支持jakarta:

 

3. 降级到tomcat9, 因为tomcat9的servlet接口是javax.servlet不是jakarta

Logo

鸿蒙生态一站式服务平台。

更多推荐