Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven Tomcat将servlet转换为javax.servlet.servlet而不是jakarta.servlet.http.HttpServlet_Maven_Tomcat_Servlets_Classcastexception - Fatal编程技术网

Maven Tomcat将servlet转换为javax.servlet.servlet而不是jakarta.servlet.http.HttpServlet

Maven Tomcat将servlet转换为javax.servlet.servlet而不是jakarta.servlet.http.HttpServlet,maven,tomcat,servlets,classcastexception,Maven,Tomcat,Servlets,Classcastexception,我一直试图实现Tomcat9的JakartaServlet,而不是之前的javax.servlet实现(因为我认为jakarta包是前进的方向)。问题是,当我将浏览器指向servlet的url时,会出现以下错误 问题很明显。Tomcat试图将我的jakarta.servlet.http.HttpServlet转换为javax.servlet.servlet,这显然是行不通的。我无法理解的是如何告诉它servlet实际实现的是什么类 类本身声明为 package cti.nm.web; impor

我一直试图实现Tomcat9的JakartaServlet,而不是之前的javax.servlet实现(因为我认为jakarta包是前进的方向)。问题是,当我将浏览器指向servlet的url时,会出现以下错误

问题很明显。Tomcat试图将我的jakarta.servlet.http.HttpServlet转换为javax.servlet.servlet,这显然是行不通的。我无法理解的是如何告诉它servlet实际实现的是什么类

类本身声明为

package cti.nm.web;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class Index extends HttpServlet {
     
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
      throws IOException, ServletException {

        response.setContentType("text/html");
       //print a bunch of stuff
    }
}

我的web.xml文件如下所示

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                             https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
         
    <display-name>NMWeb</display-name>
    <description>
       NMWeb Description
    </description>

    <servlet>
        <servlet-name>Index</servlet-name>
        <servlet-class>cti.nm.web.Index</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Index</servlet-name>
        <url-pattern>/NMWeb</url-pattern>
    </servlet-mapping>

</web-app>  

网络管理
NMWeb描述
指数
cti.nm.web.Index
指数
/网络管理
我曾希望在部署描述符中使用适当的jakartaexmlschema会导致使用正确的类别,但显然不是这样。战争似乎包含了适当的罐子

jakarta.jakartaee-api-9.0.0.jar
tomcat-el-api-10.0.0.jar
tomcat-servlet-api-10.0.0.jar jakarta.servlet-api-5.0.0.jar
tomcat-jsp-api-10.0.0.jar

pom指定为

<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cti.nm.NMWeb</groupId>
  <artifactId>NMWeb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>jakarta.platform</groupId>
      <artifactId>jakarta.jakartaee-api</artifactId>
      <version>[9.0.0,)</version>
      
    </dependency>
    <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>[5.0.0,)</version>
      
    </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jsp-api -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jsp-api</artifactId>
            <version>[10.0.0,)</version>
       
        </dependency>
  </dependencies>
</project>

4.0.0
cti.nm.NMWeb
网络管理
0.0.1-快照
战争
src
maven编译器插件
3.8.1
1.8
1.8
maven战争插件
3.2.3
网络内容
雅加达平台
jakarta.jakartaee-api
[9.0.0,)
jakarta.servlet
jakarta.servlet-api
[5.0.0,)
org.apache.tomcat
tomcat jsp api
[10.0.0,)

在网上搜索这个问题的答案已经有好几天了,我似乎找不到这个确切场景的任何其他实例。我应该提到的是,这是一个eclipse生成的问题,我已经手动修改过。在部署war文件时,使用maven和eclipse生成的结果是相同的。

你基本上是phys在WAR中包括Tomcat 10.x特定的库,然后将WAR部署到Tomcat 9.x。这根本不是正确的方法。此外,Tomcat 10.x是第一个被人工化的版本,而不是Tomcat 9.x

对于基于Servlet 4.0、JSP 2.3、EL 3.0、WS 1.1和JASIC 1.0的Tomcat 9.x,您应该使用
javax.
导入,并且整个
部分应该至少看起来像:


javax.servlet
,因此您应该只在
pom.xml
中声明它们

例如,JSTL需要按照中的说明单独安装,JSF需要按照中的说明单独安装,CDI需要按照中的说明单独安装

但是,如果您在为Tomcat开发代码的过程中非常清楚这一限制(即,确保您自己在没有首先在Tomcat中实际安装它们的情况下不会意外地使用例如JSTL、CDI、BV、JPA等),并且只想最小化
pom.xml
样板文件,那么您也可以使用Tomcat 9.x的这种最小依赖项配置:


爪哇

  • <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">
      <modelVersion>4.0.0</modelVersion>
      <groupId>cti.nm.NMWeb</groupId>
      <artifactId>NMWeb</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.3</version>
            <configuration>
              <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
          </plugin>
        </plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>jakarta.platform</groupId>
          <artifactId>jakarta.jakartaee-api</artifactId>
          <version>[9.0.0,)</version>
          
        </dependency>
        <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
        <dependency>
          <groupId>jakarta.servlet</groupId>
          <artifactId>jakarta.servlet-api</artifactId>
          <version>[5.0.0,)</version>
          
        </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jsp-api -->
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jsp-api</artifactId>
                <version>[10.0.0,)</version>
           
            </dependency>
      </dependencies>
    </project>