如何解决Tomcat过滤器启动失败(javax.servlet.Filter缺失)问题?
解决Struts 2.3.30启动Filter失败+404问题
问题根源
- Servlet API不匹配:
javax.servlet.Filter找不到,要么是Tomcat版本过高(比如10+改用jakarta.servlet替代javax.servlet命名空间),要么是Maven中servlet-api依赖的scope设置错误,导致运行时缺失核心类。 - Java版本兼容性冲突:Struts 2.3.30是2016年的老版本,官方仅支持Java 6/7/8,Java 17的语法规则和类库变更会引发兼容性问题。
一步步解决
1. 将Java版本降级至8
Struts 2.3.x最高兼容Java 8,必须调整版本:
- 修改
pom.xml添加版本配置:
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
- 调整IntelliJ IDEA配置:打开
File > Project Structure,将Project SDK、Module SDK均设置为Java 8;再进入Settings > Build, Execution, Deployment > Compiler > Java Compiler,把Target bytecode version改为1.8。
2. 修正Servlet API依赖配置
Tomcat自带Servlet API,因此Maven依赖需设置为provided(无需打包到war包中):
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
注意:如果当前使用Tomcat 10+,直接降级到Tomcat 9.x版本——Struts 2.3.x不支持Jakarta Servlet规范,Tomcat 9仍使用
javax.servlet,刚好匹配。
3. 切换至Tomcat 9.x版本
将Tomcat替换为9.x系列(比如9.0.80),确保和Struts 2.3.30的依赖完全兼容。
4. 检查Struts核心依赖完整性
确保核心依赖齐全,避免缺失必要组件:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.30</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.30</version> </dependency>
5. 清理缓存并重新构建
- 执行Maven命令清理旧构建文件并重新拉取依赖:
mvn clean install -U - 清除IntelliJ IDEA缓存:
File > Invalidate Caches...,选择Invalidate and Restart,彻底清除IDE缓存。
验证步骤
- 启动Tomcat 9,查看控制台是否不再出现Filter启动失败的报错。
- 访问项目根路径(如
http://localhost:8080/你的项目名称),检查页面是否能正常加载。
内容的提问来源于stack exchange,提问作者jakechowder
相关产品推荐
相关产品推荐

