前言
因工作需要,在搭建新的环境时,需要部署war服务,然后初次选择容器时决定使用tomcat8.5,结果遇到了问题,在同事提醒下使用tomcat9才得以解决,但是不能只解决问题,还需要查询产生原因,故有了以下的问题查询过程,= =!以防万一,以下截图已脱敏。
问题查找
1.服务启动日志
以下为部分启动日志,其他的看的都没有意义,就看那个红框,他说了服务启动失败,所以去看看详细日志去吧。
2.错误日志
根据提示“”完整的详细信息将在对应的容器日志文件中找到“,去tomcat的log目录下查看localhost.2021-12-03.log文件
从这可以得知两件事1.过滤器启动异常 2.报错的方法是过滤器的初始化方法,所以到这里明确了下一步要干的事了,去看看Filter。
3.代码比对
Filter所在jar包:servlet-api.jar
因为本地并没有Filter接口所在jar包的源码,所以这里我用了jd-gui进行反编译获得了代码
tomcat8.5:
tomcat9:
war包部署的服务使用的:
其实到这里就已经有大概的猜测了,在jdk1.8以前,接口默认使用的都是abstract进行修饰,而jdk1.8的新特性就是允许接口使用default关键字,有一个默认方法,所以有可能是部署的项目里存在实现Filter接口,但是没有重写init方法的情况,所以继续查。
4.查找问题
因为实现Filter接口的方法不便于截图,故仅提供查找的方法
最后查看得知这个方法是存在于私有远程仓库里的一个依赖,而且他的确没有重写Filter的init方法,所以导致在部署到tomcat8.5时报错,因为tomcat8.5使用的Filter中的init是个抽象接口,实现这个接口的类必须重写init方法,可能开发人员当初并没有考虑对低版本的兼容性问题,所以服务部署到tomcat8.5时会报错。