Maven Tomcat将servlet转换为javax.servlet.servlet而不是jakarta.servlet.http.HttpServlet
我一直试图实现Tomcat9的JakartaServlet,而不是之前的javax.servlet实现(因为我认为jakarta包是前进的方向)。问题是,当我将浏览器指向servlet的url时,会出现以下错误 问题很明显。Tomcat试图将我的jakarta.servlet.http.HttpServlet转换为javax.servlet.servlet,这显然是行不通的。我无法理解的是如何告诉它servlet实际实现的是什么类 类本身声明为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
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.jartomcat-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>