Spring MVC项目Eclipse部署Tomcat正常,手动部署报404求排查指导
排查Spring MVC手动部署Tomcat出现404的常见原因
这种情况我之前也碰到过,Eclipse里跑正常但手动部署就404,大多是部署细节或者配置的小问题,给你列几个最关键的排查方向:
1. War包构建不完整
Eclipse部署时会自动处理依赖和资源文件,但手动打包的War包很容易缺东西:
- 解压War包检查结构:确保
WEB-INF/classes目录下有编译好的Controller、配置类等class文件,WEB-INF/lib目录包含所有必要的依赖Jar(Spring MVC、Servlet API等) - 对比Eclipse自动部署的项目目录(一般在Tomcat的webapps或Eclipse workspace的
.metadata路径下),看手动打包的War包少了哪些文件 - 检查Maven/Gradle打包配置:比如Maven的
war插件是否正确包含了src/main/resources下的配置文件,有没有误排除依赖
2. 上下文根(Context Root)不匹配
Eclipse里部署时你可能自定义了上下文根(比如/myapp),但手动部署的默认规则不一样:
- Tomcat默认会用War包的名称作为上下文根,比如War包叫
spring-mvc-demo.war,访问路径就得是http://localhost:8080/spring-mvc-demo/xxx,如果还是用Eclipse里的旧路径就会404 - 可以手动指定上下文根:在Tomcat的
conf/server.xml中添加<Context docBase="你的War包路径" path="/myapp"/>,或者在conf/Catalina/localhost下创建myapp.xml文件配置上下文
3. Servlet映射与Spring配置错误
检查核心配置是否正确生效:
- 查看
WEB-INF/web.xml里的DispatcherServlet配置:确保映射的URL模式(比如/或*.do)正确,contextConfigLocation指向了正确的Spring配置文件(比如classpath:spring-servlet.xml) - 若用注解驱动:确认配置类加了
@EnableWebMvc,@ComponentScan指定了正确的Controller所在包路径 - 验证配置文件位置:Spring的XML或配置类是否在
WEB-INF/classes目录下(也就是classpath中),手动打包时容易漏掉src/main/resources下的资源
4. Tomcat版本与依赖不兼容
Eclipse和手动部署的Tomcat版本如果不一致,很容易出兼容性问题:
- Tomcat 9对应Spring MVC 5.x(依赖javax.servlet API),Tomcat 10对应Spring MVC 6.x(依赖jakarta.servlet API),版本不匹配会导致DispatcherServlet无法初始化
- 检查Spring MVC的pom.xml/gradle配置,确保依赖的Servlet API版本和Tomcat版本对应
5. 日志定位具体错误
直接看Tomcat的日志文件,能快速找到问题根源:
- 查看
logs/localhost.log、logs/catalina.out:如果有ClassNotFoundException说明缺Jar包,BeanCreationException说明Spring配置有问题,XMLParseException说明配置文件语法错误 - 查看
logs/localhost_access_log.*.txt:确认请求的URL是否和部署后的上下文根匹配
6. 文件权限问题(Linux系统常见)
如果是在Linux上部署,Tomcat运行用户可能没有权限访问War包或解压后的文件:
- 检查webapps目录下的项目文件夹权限,确保Tomcat用户(比如
tomcat)有读权限 - 可以用
chown -R tomcat:tomcat /path/to/tomcat/webapps/你的项目来修改权限
7. 清理Tomcat缓存
Tomcat的缓存可能导致旧配置残留:
- 停掉Tomcat,删除
webapps下的项目文件夹和work/Catalina/localhost下的对应缓存目录 - 重新启动Tomcat,再部署War包
内容的提问来源于stack exchange,提问作者Ishant Gaurav
相关产品推荐
相关产品推荐

