You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Struts 2.5.29版本时出现StrutsPrepareAndExecuteFilter ClassNotFoundException的问题排查

解决Struts2 2.5.29的ClassNotFoundException(org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter)

从你的错误日志和配置来看,核心问题是Tomcat无法找到Struts2的核心过滤器类,这通常是jar包缺失或者部署时jar包未被正确加载导致的。下面是一步步的解决方法:

1. 确认WEB-INF/lib下的必备核心jar包

Struts2 2.5.29启动必须依赖以下核心jar包,务必确保它们都在项目的WEB-INF/lib目录下(而不仅仅是添加到IDE的构建路径):

  • struts2-core-2.5.29.jar(这个jar包包含你缺失的StrutsPrepareAndExecuteFilter类,是核心中的核心)
  • commons-lang3-3.8.1.jar
  • commons-logging-1.2.jar
  • freemarker-2.3.30.jar
  • ognl-3.1.26.jar
  • javassist-3.24.0-GA.jar

注意:IDE的构建路径(比如Eclipse的Build Path)只是编译阶段生效,Tomcat部署时只会读取WEB-INF/lib下的jar包,所以一定要把这些jar手动复制到该目录,或者通过IDE的部署配置自动同步。

2. 检查IDE的部署配置(关键!)

如果你用Eclipse/IDEA开发,很容易出现“构建路径有jar,但部署时没带上”的情况:

  • Eclipse:右键项目 → Properties → Deployment Assembly,确认是否添加了WEB-INF/lib的jar包到部署列表中。如果没有,点击Add → Java Build Path Entries,选择对应的jar包添加进去。
  • IDEA:打开Project Structure → Artifacts,找到你的Web应用 artifact,确保WEB-INF/lib目录下包含所有需要的Struts2 jar包。

3. 确认过滤器类路径正确

你web.xml中配置的过滤器类路径org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter是Struts2 2.5.x版本的正确路径(Struts2 2.3.x版本路径不同),这部分配置没有问题,不需要修改。

4. 清理缓存并重新部署

有时候旧的缓存会导致异常:

  • 删除Tomcat安装目录下work/Catalina/localhost/你的项目名的所有内容,清理Tomcat的类缓存。
  • 清理项目的编译输出目录(比如Eclipse的bin、IDEA的target),重新编译项目。
  • 重新部署项目到Tomcat,然后启动服务器。

额外补充:解决Log4j2警告

日志中出现的Log4j2 could not find a logging implementation警告不会影响项目启动,但如果想消除它,可以添加log4j-core-2.x.jar和log4j-api-2.x.jar到WEB-INF/lib目录下。


你的配置文件参考

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="default" extends="struts-default">
        <action name="getTutorial" class="com.struts.action.TutorialAction">
            <result name="success">/success.jsp</result>
            <result name="failure">/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="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
    <display-name>Struts2Starter</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</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>

TutorialAction.java

package com.struts.action;
public class TutorialAction {
    public String execute() {
        System.out.println("Hello from execute");
        return "success";
    }
}

错误日志

Mar 09, 2022 10:01:32 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8081"]
Mar 09, 2022 10:01:32 AM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [656] milliseconds
Mar 09, 2022 10:01:32 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
Mar 09, 2022 10:01:32 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.58]
Mar 09, 2022 10:01:37 AM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Mar 09, 2022 10:01:37 AM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
Mar 09, 2022 10:01:38 AM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Mar 09, 2022 10:01:40 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter [struts2]
java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1407)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1215)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:534)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:515)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:149)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:251)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:102)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4613)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
Mar 09, 2022 10:01:40 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: One or more Filters failed to start. Full details will be found in the appropriate container log file
Mar 09, 2022 10:01:40 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/Struts2Starter] startup failed due to previous errors
Mar 09, 2022 10:01:40 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8081"]
Mar 09, 2022 10:01:40 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in [8729] milliseconds

内容的提问来源于stack exchange,提问作者aomer3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:09:06