Bootstrap

tomcat项目运行后报500

HTTP状态 500 - 内部服务器错误
类型 异常报告

消息 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常

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

例外情况

jakarta.servlet.ServletException: 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	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:63)
	java.base/java.lang.Thread.run(Thread.java:833)
根本原因。

java.lang.NoClassDefFoundError: javax/servlet/Servlet
	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:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	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:63)
	java.base/java.lang.Thread.run(Thread.java:833)
根本原因。

java.lang.ClassNotFoundException: javax.servlet.Servlet
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	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:2352)
	org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	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:63)
	java.base/java.lang.Thread.run(Thread.java:833)
):注意 主要问题的全部 stack 信息可以在 server logs 里查看

Apache Tomcat/10.1.19

tomcat项目运行后,浏览器端显示500,

错误分析

  • 遇到了 HTTP 500 内部服务器错误,具体问题是在实例化 com.mdy.servlet_02.LifeDemoServlet 时出现异常。
  • 根本原因是 java.lang.NoClassDefFoundError: javax/servlet/Servlet 和 java.lang.ClassNotFoundException: javax.servlet.Servlet,这表明在 Tomcat 尝试加载 javax.servlet.Servlet 类时未能找到该类,很可能是项目的依赖缺失或配置错误。

解决方法

  1. 检查项目依赖(Maven 项目)
    • 如果你使用 Maven 管理项目,确保在 pom.xml 文件中添加了正确的 Servlet API 依赖。对于 Apache Tomcat 10.1.19,你应该使用 Jakarta Servlet API。添加或更新以下依赖:
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>5.0.0</version>
        <scope>provided</scope>
    </dependency>
    

    这里使用了 Jakarta Servlet API 5.0.0 版本,它与 Tomcat 10.1.19 相匹配。

    • 然后运行以下 Maven 命令重新构建项目:
    mvn clean package
    

    这将更新项目的依赖并重新打包。

  2. 检查项目依赖(Gradle 项目)
    • 对于 Gradle 项目,在 build.gradle 文件中添加或更新以下依赖:
    implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
    

    同样使用 Jakarta Servlet API 5.0.0 版本。

    • 运行以下 Gradle 命令重新构建项目:
    gradle clean build
    
  3. 手动添加依赖(传统项目)
    • 若不使用构建工具,需要手动将 Servlet API 的 JAR 文件添加到项目的 WEB-INF/lib 目录中。
    • 你可以从 Maven 中央仓库下载 jakarta.servlet-api-5.0.0.jar,将其放置在 WEB-INF/lib 目录。
    • 确保 Tomcat 版本和 Servlet API 版本兼容,Tomcat 10.1.19 遵循 Jakarta EE 9 及以上的 Servlet 规范,使用 Jakarta Servlet API。

代码解释

  • 当 Tomcat 收到请求并尝试调用 com.mdy.servlet_02.LifeDemoServlet 时,会根据 web.xml 中的配置或注解来实例化该 Servlet。
  • 在这个过程中,由于缺少 javax.servlet.Servlet 类(这里应该是 jakarta.servlet.Servlet 因为 Tomcat 10.x 采用了 Jakarta EE 规范),会导致类加载器抛出 ClassNotFoundException,进而引发 ServletException

注意事项

  • 请确认 Tomcat 的部署和配置是否正确,包括 web.xml 中 Servlet 的声明和映射。例如:
    <servlet>
        <servlet-name>LifeDemoServlet</servlet-name>
        <servlet-class>com.mdy.servlet_02.LifeDemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifeDemoServlet</servlet-name>
        <url-pattern>/lifedemo</url-pattern>
    </servlet-mapping>
    
  • 确保你的 IDE(如果使用)的类路径和项目构建路径中包含了 Servlet API。
  • 清理 Tomcat 的 work 目录,该目录包含已编译的 Servlet 类,可能会导致冲突,删除该目录下对应项目的类文件,让 Tomcat 重新编译和加载。

通过上述步骤,你可以解决因 Servlet API 类缺失导致的 HTTP 500 错误,确保项目正常运行。同时,需要注意 Tomcat 版本和 Servlet API 版本的兼容性,以避免类似问题的再次发生。

;