You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止Tomcat在Servlet启动失败后返回404而非含堆栈跟踪的500错误?

如何阻止Tomcat在Servlet启动失败后返回404而非含堆栈跟踪的500错误?

这个问题我之前调试Tomcat 10的时候也踩过坑!默认机制真的挺反人类的——第一次Servlet启动失败(比如API版本不兼容、类文件版本太高这类启动级错误),Tomcat就直接把整个WAR包标记为禁用,后面再访问直接返回404,连半点错误提示都没有,排查问题简直要挠头。

不过别担心,改两个配置就能解决,分两种场景给你说:

  • 单个应用生效(推荐,不影响其他应用)
    打开你WAR包的META-INF目录,创建或修改context.xml文件,在<Context>标签里加上failCtxIfServletStartFails="false"属性,示例代码如下:

    <Context failCtxIfServletStartFails="false">
        <!-- 这里可以保留你原本的其他配置项 -->
    </Context>
    

    原理很简单:默认这个属性是true,意思是Servlet启动失败就直接让整个上下文(应用)不可用;设为false之后,上下文会保持可用状态,每次请求那个有问题的Servlet时,Tomcat都会尝试重新初始化它,这时候就会返回500错误,还会带上完整的堆栈跟踪信息,调试起来直接看响应里的错误就行,不用再反复重启部署了!

  • 全局所有应用生效
    如果你想让服务器上所有应用都用这个规则,就去Tomcat安装目录下的conf文件夹,修改context.xml文件,同样在<Context>标签里添加failCtxIfServletStartFails="false"属性,和上面的代码示例一样。

另外提一句,要是你还想在Tomcat启动日志里也看到启动失败的堆栈,确保catalina.out或者localhost.log的日志级别是INFO及以上就行,不过上面的配置已经能帮你在请求时直接拿到错误信息,调试效率提升不少。

内容来源于stack exchange

火山引擎 最新活动