错误记录:从把项目从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.xmlbuild.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 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
空中海12 小时前
第二章:Maven进阶篇 — 依赖管理与构建生命周期
java·maven
空中海13 小时前
第三章:Maven高级篇 — 插件开发与多模块工程
java·maven
子木HAPPY阳VIP14 小时前
信创UOS,Docker 完整操作部署(Dockerfile部署方式)&排错整合
linux·运维·redis·nginx·docker·容器·tomcat
EvenBoy14 小时前
IDEA中使用CodeX
java·ide·intellij-idea
橙子圆12315 小时前
Mybatis之动态sql
sql·tomcat·mybatis
天码-行空15 小时前
深入拆解 Tomcat 架构:高层组件与启动流程设计
java·架构·tomcat
天码-行空15 小时前
深入拆解 Tomcat 架构:一键启停与生命周期设计
java·架构·tomcat
lst042617 小时前
Maven 构建命令
java·maven
空中海17 小时前
第一章:入门篇 — Maven 核心概念与基础使用
java·maven