SpringBoot应用本地正常,部署到DailyRazor Tomcat后返回404
Spring Boot部署Tomcat 8遇404及类加载/内存问题解决指南
问题根源分析
从你提供的Tomcat日志看,两个核心问题导致服务异常:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.tomcat.util.buf.B2CConverter:War包内置Tomcat类与服务器端Tomcat 8冲突,引发核心类初始化失败java.lang.OutOfMemoryError: Java heap space:Tomcat堆内存不足,导致服务启动或请求处理失败
分步修复方案
1. 修复War包依赖,消除Tomcat类冲突
你的build.gradle未将Spring Boot内置Tomcat标记为providedRuntime,导致War包携带Tomcat核心类,与服务器端Tomcat产生冲突。
修改dependencies块,添加:
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
无需指定版本,Spring Boot依赖管理会自动匹配你的2.2.2.RELEASE版本,避免版本不一致问题。
同时清理冗余依赖:
- 删除重复的
com.h2database:h2依赖,只保留一行即可 - 移除
compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.2',这是Maven插件,Gradle项目无需引入
2. 调整Tomcat堆内存配置
DailyRazor的Tomcat默认堆内存不足以支撑应用启动,需调整JVM参数:
- 联系服务商修改Tomcat启动参数,或找到
bin/catalina.sh(Linux)/catalina.bat(Windows)文件 - 添加JVM参数:
(初始堆512MB,最大堆1GB,可根据应用规模调整)-Xms512m -Xmx1024m
3. 验证War包有效性
- 执行
gradlew clean bootWar重新打包,确保War包生成在build/libs目录 - 解压War包,检查
WEB-INF/lib中无tomcat-*开头的核心依赖(仅保留API类) - 确认访问路径:若War包名为
xxx.war,访问URL需带上上下文路径http://你的域名/xxx/,而非直接访问根路径
4. 确认Spring Boot启动类配置
你的启动类已正确继承SpringBootServletInitializer并实现configure方法,额外需注意:
- 启动类所在包需为所有业务类的父包,确保Spring能自动扫描组件
- 若自定义
@ComponentScan注解,需包含所有需扫描的包路径
额外排查项
- 确认服务商Tomcat版本:Spring Boot 2.2.x兼容Tomcat 8.5.x及以上,若为Tomcat 8.0.x可能存在兼容性问题,建议升级到8.5+
- 查看Tomcat的
localhost.log,确认应用启动过程中是否有其他报错信息
内容的提问来源于stack exchange,提问作者Abdullah Howard
相关产品推荐
相关产品推荐

