【问题标题】:Running a simple java Servlet gives Class is not a Servlet error运行一个简单的 java Servlet 给出 Class is not a Servlet 错误
【发布时间】:2016-06-27 12:33:58
【问题描述】:

我有一个简单的 Java servlet 项目,我正在通过 maven tomcat 插件运行。点击 url,我得到了这个错误

javax.servlet.ServletException: Class in.vshukla.MyServlet is not a Servlet

java.lang.ClassCastException: in.vshukla.MyServlet cannot be cast to javax.servlet.Servlet

servlet 类是

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class MyServlet implements Servlet {
    .
    .
    .
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        PrintWriter out = servletResponse.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>Hello, world!</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
    .
    .
    .
}

这伴随着一个简单的 web.xml 文件。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
     <servlet>
         <servlet-name>servlet</servlet-name>
         <servlet-class>in.vshukla.MyServlet</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>servlet</servlet-name>
         <url-pattern>/*</url-pattern>
     </servlet-mapping>
</web-app>

我已经交叉检查了生成的战争文件。我将 tree 命令的输出附加到 war 文件中。

. |-- 元信息 `-- 网络信息 |-- 班级 | |-- 在 | | `--vshukla | | `-- MyServlet.class | `--弹簧 | `-- spring_config.xml |-- 库 | |-- javax.servlet-api-3.1.0.jar | `-- my-data-0.1-SNAPSHOT.jar `-- web.xml 7个目录,5个文件

我正在使用 maven 构建它。 以下是 pom.xml 文件。

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <parent>
    <groupId>in.vshukla</groupId>
    <artifactId>my</artifactId>
    <version>0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-api</artifactId>
  <packaging>war</packaging>

  <properties>
    <javax.version>3.1.0</javax.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>in.vshukla</groupId>
      <artifactId>my-data</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${javax.version}</version>
    </dependency>
  </dependencies>

</project>

即使 MyServlet 类正在实现 javax Servlet,我仍然收到此错误。

我做错了什么?

【问题讨论】:

  • 能否请您粘贴导入部分?
  • 如果你改为 public class MyServlet extends HttpServlet {
  • @Sarker :添加了导入部分。如果我扩展 HttpServlet,它会给出同样的错误。
  • 只需按照 IanLovejoy 的回答从您的 .war 文件中删除 javax.servlet-api-3.1.0.jar,您的问题就会消失。

标签: java tomcat servlets


【解决方案1】:

您通常不希望在 .war 中包含 javax.servlet-api-3.1.0.jar。它将由框架提供。如果两个类由不同的类加载器加载,即使它们具有相同的包和名称,它们也会被视为不同的类。

【讨论】:

  • 可能想要更强调地说明它,例如,DON'T 包括javax.servlet-api-3.1.0.jar。您应该绝不将其包含在.war 文件中。
  • @Andreas haha​​ 是的,好建议,我想我有时会礼貌到掩盖我的观点。也许是一个中间立场——“你不应该...”
  • 好的。如何防止它被卷入战争?
  • @venky 这首先取决于它是如何进入那里的。您尚未共享您的构建脚本。如果使用 Maven,请参阅此问题:stackoverflow.com/questions/6646959/…
  • @venky 然后添加&lt;scope&gt;provided&lt;/scope&gt;
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 2015-05-04
  • 2018-07-23
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多