Tomcat正在查找javax.servlet.filter,但我有jakarta.servlet.filter

c90pui9n  于 2022-12-19  发布在  Java
关注(0)|答案(2)|浏览(187)

我在struts上创建了一个动态web项目,当我尝试执行它时,我得到了错误
java.lang.NoClassDefFoundError:javax/servlet/过滤器导致的原因:java.lang.ClassNotFoundException:javax.servlet.Filter
问题是Tomcat正在查找javax.servlet.Filter,但〉我有jakarta.servlet.Filter

Tomcat Version : 10.0
Struts Version : 2.5

有人能帮忙吗?先谢了。

项目树

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" 
    "http://struts.apache.org/dtds/struts-2.5.dtd">  
<struts>
    <package name="first" extends="struts-default">
        <action name="Action" class="guild.Action">  
            <result name="success">/success.jsp</result>   
            <result name="error">/error.jsp</result>  
        </action>
    </package>  
</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="5.0">
  <display-name>FSGuild</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

Action.java

package guild;

public class Action {
    public String execute() {
        System.out.println("Someone called execute");
        return "SUCCESS";
    }
}

error.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Error</title>
</head>
<body>
    <h1>ERROR</h1>
</body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>SUCCESS</title>
</head>
<body>
    <h1>SUCCESS</h1>
</body>
</html>
mjqavswn

mjqavswn1#

问题是您使用的是Struts,而Struts还没有更新以支持Servlet规范5.0或更高版本(请参阅https://issues.apache.org/jira/browse/WW-5141)。Servlet规范5.0引入了一个重大的突破性变化,即将API从包javax.servlet移动到jakarta.servlet。这意味着仍然使用旧包名称的库等将无法使用。
您需要切换到Tomcat 9并将应用程序定义为Servlet规范4.0 Web应用程序(或Servlet规范3.1)。

0yg35tkg

0yg35tkg2#

javax.servlet是JavaEE规范(Servlet规范〈= 5.0),jakarta.servlet是JakartaEE规范(Servlet规范〉= 6.0)。
您需要做的就是从Tomcat 10.0切换到10.1。
另见

唯一可能出现的问题是,如果您的应用程序具有两种规范的类,那么您可能希望找到一个可以在两种规范上并行运行的容器,例如符合https://docs.wildfly.org/的Wildfly 22.0.0

相关问题