运行一个简单的Javaservlet并不是一个Servlet错误

运行一个简单的Javaservlet并不是一个Servlet错误,java,tomcat,servlets,Java,Tomcat,Servlets,我有一个简单的Javaservlet项目,我正在通过maven tomcat插件运行它 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.Servle

我有一个简单的Javaservlet项目,我正在通过maven tomcat插件运行它

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();
    }
    .
    .
    .
}
import javax.servlet.servlet;
导入javax.servlet.ServletConfig;
导入javax.servlet.ServletException;
导入javax.servlet.ServletRequest;
导入javax.servlet.ServletResponse;
导入java.io.IOException;
导入java.io.PrintWriter;
公共类MyServlet实现Servlet{
.
.
.
公共void服务(ServletRequest ServletRequest,ServletResponse ServletResponse)抛出ServletException,IOException{
PrintWriter out=servletResponse.getWriter();
out.println(“”);
out.println(“”);
out.println(“你好,世界!”);
out.println(“”);
out.println(“”);
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>
<?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>

servlet
in.vshukla.MyServlet
servlet
/*
我已经交叉检查了生成的war文件。我在war文件上附加tree命令的输出

. |-- META-INF `-- WEB-INF |-- classes | |-- in | | `-- vshukla | | `-- MyServlet.class | `-- spring | `-- spring_config.xml |-- lib | |-- javax.servlet-api-3.1.0.jar | `-- my-data-0.1-SNAPSHOT.jar `-- web.xml 7 directories, 5 files . |--META-INF `--WEB-INF |--班级 ||--in || `--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文件

<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>
<?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>

in.vshukla
我的
0.1-1快照
4.0.0
我的api
战争
3.1.0
in.vshukla
我的数据
${project.parent.version}
javax.servlet
javax.servlet-api
${javax.version}
即使MyServlet类正在实现一个javaxservlet,我也会遇到这个错误


我做错了什么?

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

请粘贴导入部分好吗?如果改为使用公共类MyServlet Extendes HttpServlet呢{@Sarker:添加了导入部分。如果我扩展了HttpServlet,则会出现相同的错误。只需从
.war
文件中删除
javax.servlet-api-3.1.0.jar
,正如IanLovejoy在回答中指定的那样,您的问题就会消失。您可能想更强调地说明它,例如,不要包含
javax.servlet-api-3.1.0.jar
永远不要将它包含在
.war
文件中。@Andreas哈哈,是的,好建议,我想我有时会礼貌地掩盖我的观点。也许是一个中间立场——“你不应该……”好的。我如何防止它被包括在战争中?@venky这取决于它最初是如何进入那里的。你还没有共享你的构建脚本。如果使用Maven,请参阅以下问题:@venky然后添加
提供的