2016-03-12 2 views
1

У меня есть простой сервлет проект Java, который я бег через Maven кот plugin.Hitting URL-адрес, я получаю эту ошибкуЗапуска простого Java Servlet дает класс не ошибка Servlet

класса
javax.servlet.ServletException: Class in.vshukla.MyServlet is not a Servlet 

java.lang.ClassCastException: in.vshukla.MyServlet cannot be cast to javax.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> 

У меня есть перекрестный проверенный файл войны. Я прикрепляю вывод команды дерева к файлу войны.

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

Я строил это с помощью 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, я получаю эту ошибку.

Что я делаю неправильно?

+0

Не могли бы вы вставить раздел импорта, пожалуйста? – Sarker

+0

Что делать, если вы используете открытый класс MyServlet extends HttpServlet { – Sarker

+0

@Sarker: Добавлен раздел импорта. Это дает ту же ошибку, если я расширяю HttpServlet. – venky

ответ

2

Обычно вы не хотите включать javax.servlet-api-3.1.0.jar в свой .war. Он будет обеспечен рамками. Если два класса загружаются разными загрузчиками классов, даже если они имеют один и тот же пакет и имя, они будут считаться отдельными классами.

+3

Можете высказать это более решительно, например, * НЕ ВКЛЮЧАТЬ 'javax.servlet-api-3.1.0.jar'. Вы должны * НИКОГДА не включать его в файл '.war'. – Andreas

+0

@ Андреас ха-ха да, хорошее предложение, я думаю, что я иногда вежлив до того, что скрываю свою мысль. Возможно, средняя точка - «вы не должны» ... –

+0

Хорошо. Как я могу предотвратить его включение в войну? – venky