JDK1.7升17与Tomcat9升10.1.7部署WAR包报错求助
问题
将应用的JDK版本从1.7升级至17,同时将Tomcat从9.0.20升级到10.1.7。已完成Servlet依赖升级至6.0.0(使用jakarta.servlet包)、将web.xml的XSD从web-app_2_5.xsd更新为web-app_4_0.xsd,且已解决所有编译错误,但部署WAR包时出现以下错误:
24-Apr-2023 21:01:50.458 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [C:\Users\absharma\Desktop\TASK\tomcat\webapps\WebApp_demo_version3.war] 24-Apr-2023 21:02:01.488 INFO [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 24-Apr-2023 21:02:01.488 SEVERE [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [C:\Users\absharma\Desktop\TASK\tomcat\webapps\WebApp_demo_version3.war] java.lang.IllegalStateException: Error starting child at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:713) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:975) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1949) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:776) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1705) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:305) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1102) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1301) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1305) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1283) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/WebApp_demo_version3]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) ... 24 more Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletRequestListener at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2487) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:490) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:472) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142) at org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1010) at org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:549) at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4875) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 25 more Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletRequestListener at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1437) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245) ... 40 more 24-Apr-2023 21:02:01.496 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [C:\Users\absharma\Desktop\TASK\tomcat\webapps\WebApp_demo_version3.war] has finished in [11,038] ms
已尝试的操作:
- 将Servlet Jar从2.5版本升级至6.0.0
- 将XML文件从web-app_2_5.xsd更新为web-app_4_0.xsd
目标是成功将应用升级至JDK17和Tomcat10.1.7。
解决建议
这个错误的核心是应用中仍存在对javax.servlet包的依赖引用,Tomcat 10+ 完全使用jakarta.servlet包,不再支持旧的javax命名空间,以下是具体排查和修复步骤:
全面替换代码中的
javax.servlet引用- 检查所有Java类,确保所有导入语句从
javax.servlet.*替换为jakarta.servlet.*,包括ServletRequestListener、Servlet、Filter等所有相关类。 - 检查JSP文件中的
<%@ page import %>指令,同样替换命名空间。
- 检查所有Java类,确保所有导入语句从
检查依赖树,移除残留的
javax.servlet依赖- 使用构建工具(如Maven的
mvn dependency:tree或Gradle的./gradlew dependencies)生成依赖树,找出所有包含javax.servlet的依赖。 - 对于引入
javax.servlet的第三方库,优先升级到支持Jakarta EE的版本;如果无法升级,排除该依赖中的javax.servlet模块,避免与Tomcat 10+的jakarta.servlet冲突。
- 使用构建工具(如Maven的
更新web.xml的命名空间和版本
- Tomcat 10.1对应Servlet 6.0,web.xml应使用
web-app_6_0.xsd,而非web-app_4_0.xsd,修改web.xml的根元素:<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> - 同时检查web.xml中配置的监听器、过滤器等类名,确保对应的类已经完成
javax到jakarta的替换。
- Tomcat 10.1对应Servlet 6.0,web.xml应使用
清理构建产物和Tomcat缓存
- 删除项目的
target或build目录,重新构建WAR包,避免旧的编译文件残留。 - 删除Tomcat的
work目录和webapps下的解压后的应用文件夹,再重新部署新的WAR包。
- 删除项目的
检查第三方库的兼容性
- 确保所有使用的框架(如Spring、Hibernate等)都升级到支持Jakarta EE 9+的版本,比如Spring要使用5.3.x以上或Spring Boot 2.7+版本,这些版本才会使用
jakarta.servlet命名空间。
- 确保所有使用的框架(如Spring、Hibernate等)都升级到支持Jakarta EE 9+的版本,比如Spring要使用5.3.x以上或Spring Boot 2.7+版本,这些版本才会使用
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

