升级到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