You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Apache Tomcat 8升级至9时遇部署异常问题求助

问题描述

环境信息:

  • Java 8(Zulu Edition)
  • 基于老旧Seam Framework开发的应用
  • 应用在Tomcat 8中运行正常,但切换至Tomcat 9(服务器部署或IntelliJ本地部署)时出现异常页面
  • 已将Java Servlet版本从2.5升级至4.0.1(在Tomcat 8中运行无异常)
  • IntelliJ版本:2024.1

IntelliJ部署日志

java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
java.lang.Thread.run(Thread.java:748)
[2024-05-07 11:18:16,396] **Artifact newrecovery:war exploded: Error during artifact deployment. See server log for details.**

Catalina服务器日志

07-May-2024 13:14:16.170 WARNING [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [newrecovery] appears to have started a thread named [Catalina-utility-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5266)
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1314)
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1318)
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1318)
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1296)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
java.lang.Thread.run(Thread.java:748)

详细日志补充

SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class 

怀疑问题出在Tomcat 9的Servlet相关兼容性或配置上。

排查与解决建议
  1. 补全完整的listener异常日志
    当前详细日志截断了异常类名和完整栈信息,需开启Tomcat的DEBUG级别日志,获取Exception sending context initialized event的完整异常栈——这是定位问题的核心,通常是Seam上下文监听器在Tomcat 9中初始化失败导致。

  2. 验证Seam与Tomcat 9的兼容性
    老旧版本的Seam Framework(尤其是Seam 2.x)对Servlet 4.0和Tomcat 9的支持有限:

    • 确认所用Seam版本是否有官方Tomcat 9适配补丁
    • 若无补丁,尝试将Servlet版本降级至3.1(Tomcat 9支持Servlet 3.1/4.0,旧框架对4.0新特性兼容性较差)
  3. 修复线程泄漏警告
    线程泄漏可能是部署失败的副作用,但需排查Seam线程管理配置:

    • 确认Seam的异步/定时任务是否正确注册Tomcat生命周期监听器,确保应用停止时能正常销毁线程
    • 检查web.xml中是否配置了SeamListener,并保证其初始化顺序正确
  4. 调整Tomcat 9特定配置

    • 修改conf/context.xml,添加antiResourceLocking="false"和antiJARLocking="false",避免Tomcat 9的资源锁定机制影响Seam类加载
    • 检查Tomcat 9全局web.xml中是否存在与Seam冲突的监听器或过滤器
  5. 排查类加载冲突

    • 检查应用WEB-INF/lib中是否包含Tomcat自带的容器级jar包(如servlet-api.jar、el-api.jar),Tomcat 9会优先使用自身API,冲突会导致初始化失败
    • 移除WEB-INF/lib中与Tomcat 9重复的容器级jar包

内容的提问来源于stack exchange,提问作者ido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:42:24