错误记录:从把项目从Tomcat8.5.37转到Tomcat10.1.7

错误信息:在本地Servlet项目里没有报错,但是浏览器跳转该servlet时报错

型 异常报告

消息 实例化Servlet类com.wangdao.lx.MyServlet1异常

描述 服务器遇到一个意外的情况,阻止它完成请求。

例外情况

复制代码
jakarta.servlet.ServletException: 实例化Servlet类[com.wangdao.lx.MyServlet1]异常
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.base/java.lang.Thread.run(Thread.java:842)

根本原因。

复制代码
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2487)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.base/java.lang.Thread.run(Thread.java:842)

根本原因。

复制代码
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1437)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
	java.base/java.lang.ClassLoader.defineClass1(Native Method)
	java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
	java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2487)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.base/java.lang.Thread.run(Thread.java:842)

):注意 主要问题的全部 stack 信息可以在 server logs 里查看

错误原因:Tomcat 10或更高版本,那么javax.servlet.http.HttpServlet这个类已经从javax.servlet包移动到了jakarta.servlet包。因此,如果你的应用程序是用新的jakarta.servlet包编写的,但你使用了旧的Servlet API jar,或者相反,就会导致这个错误。

具体错误信息:这个异常报告表明在尝试实例化MyServlet1这个Servlet类时出现了问题。具体来说,服务器无法找到javax.servlet.http.HttpServlet这个类,这通常意味着Servlet API的jar文件没有被正确地包含在应用程序的类路径中。

这里有几个可能的原因和解决方案:

  1. 缺少Servlet API jar :确保你的Web应用程序的WEB-INF/lib目录中包含了Servlet API的jar文件。对于Java EE应用程序,这通常是javax.servlet-api.jar。
  2. 错误的Servlet API版本 :如果你正在使用的是Tomcat 10或更高版本,那么javax.servlet.http.HttpServlet这个类已经从javax.servlet包移动到了jakarta.servlet包。因此,如果你的应用程序是用新的jakarta.servlet包编写的,但你使用了旧的Servlet API jar,或者相反,就会导致这个错误。
  3. 类路径问题:确保你的开发环境(如Eclipse、IntelliJ IDEA等)和部署环境都将Servlet API的jar文件包含在了类路径中。
  4. 部署问题 :如果你是在部署到服务器上时遇到这个问题,可能是因为部署过程中没有正确地复制WEB-INF/lib目录下的jar文件。
  5. 服务器配置问题:在某些情况下,服务器的配置可能会导致这个问题。检查服务器的文档,确保没有相关的配置错误。

解决这个问题的步骤可能包括:

  • 确认WEB-INF/lib目录下是否有正确的Servlet API jar文件。
  • 如果你在使用Maven或Gradle,检查pom.xml或build.gradle文件,确保依赖项是正确的。
  • 如果你的应用程序是用新的jakarta.servlet包编写的,确保你使用的是相应的Tomcat版本和Servlet API jar。
  • 清理并重新构建你的应用程序。
  • 如果问题依然存在,检查服务器日志以获取更多信息,或者在你的开发环境中查看是否有任何配置错误。

解决方法:因为我电脑上有两个版本的tomcat

所以要把项目的tomcat自带的jar包从8版本切换到10版本的jar包

具体操作:

把原来这个地方的8版本的jar包删了

最后再把servlet里的import的jar包删了,import新的jar包,具体jar包类型请看上面错误原因。

为什么不用tomcat8,而选择tomcat10,因为,html里的表单若是中文,get或post方法提交表单时,在重写servlet的方法里若控制台输出参数值,则容易出现乱码。

因此以后选择tomcat10

相关推荐
博风6 小时前
eclipse中配置maven,以及在本地使用maven。
java·eclipse·maven
golang学习记1 天前
IDEA 断点调试技巧:拖拽
java·ide·intellij-idea
少年的范儿1 天前
IntelliJ IDEA 配置 JDK 21 与 Maven 教程(Windows):开发环境配置与验证
java·jdk·maven·intellij idea
guocy-ww2 天前
JetBrains 全家桶(IDEA、PyCharm等)合法免费方案 审核中
pycharm·intellij-idea
行者-全栈开发2 天前
【码动四季·秋】把 Spring Boot 的 Tomcat 换成 Undertow:一次容器替换的三处暗坑
spring boot·tomcat·容器化·依赖管理·undertow
peach3 天前
同样是装依赖,为什么 npm 长成 node_modules,Maven 长成 .m2
npm·node.js·maven
weixin_399380693 天前
TongWeb7.0.4.9M11如何接入到idea(by lqw)
java·ide·intellij-idea
屈冠成3 天前
ShopXO商城系统测试报告
开发语言·spring·maven·lua
宁波阿成3 天前
CentOS 7 环境下 Tomcat 8.5 升级至 9.0.123 操作总结
linux·centos·tomcat
行者-全栈开发4 天前
【Java中间件】CVE-2026-34486:Tomcat EncryptInterceptor 补丁绕过修复指南
tomcat·cve-2026-34486·encryptintercep·会话复制·集群安全·补丁绕过·cwe-311