将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相关兼容性或配置上。
排查与解决建议
补全完整的listener异常日志
当前详细日志截断了异常类名和完整栈信息,需开启Tomcat的DEBUG级别日志,获取Exception sending context initialized event的完整异常栈——这是定位问题的核心,通常是Seam上下文监听器在Tomcat 9中初始化失败导致。验证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新特性兼容性较差)
修复线程泄漏警告
线程泄漏可能是部署失败的副作用,但需排查Seam线程管理配置:- 确认Seam的异步/定时任务是否正确注册Tomcat生命周期监听器,确保应用停止时能正常销毁线程
- 检查
web.xml中是否配置了SeamListener,并保证其初始化顺序正确
调整Tomcat 9特定配置
- 修改
conf/context.xml,添加antiResourceLocking="false"和antiJARLocking="false",避免Tomcat 9的资源锁定机制影响Seam类加载 - 检查Tomcat 9全局
web.xml中是否存在与Seam冲突的监听器或过滤器
- 修改
排查类加载冲突
- 检查应用
WEB-INF/lib中是否包含Tomcat自带的容器级jar包(如servlet-api.jar、el-api.jar),Tomcat 9会优先使用自身API,冲突会导致初始化失败 - 移除
WEB-INF/lib中与Tomcat 9重复的容器级jar包
- 检查应用
内容的提问来源于stack exchange,提问作者ido
相关产品推荐
相关产品推荐

