Spring Boot部署为Tomcat的ROOT应用时卡住问题求助
解决Spring Boot WAR包在Tomcat中部署卡住的问题
从你提供的部署日志、pom配置和遇到的卡点来看,我整理了几个针对性的排查和解决方向,你可以逐一尝试:
1. 修正Spring Boot WAR包的构建配置
你的pom.xml里的Spring Boot Maven插件配置缺少了外部Tomcat部署的关键设置,这很可能是导致部署卡住的核心原因:
- 需要排除Spring Boot自带的内嵌Tomcat,避免和外部Tomcat产生冲突
- 启动类要继承
SpringBootServletInitializer,让外部Tomcat能正确识别Spring Boot应用
调整pom.xml配置:
<dependencies> <!-- 排除内嵌Tomcat依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Tomcat Servlet API依赖(仅编译时生效) --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>8.5.35</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 配置Maven War插件,允许无web.xml的情况 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build>
修改启动类:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
2. 分析阻塞线程的根源(基于JStack日志)
从你提供的JStack内容来看,负责部署的localhost-startStop-1线程处于等待状态,大概率是卡在了某个资源获取环节,常见场景包括:
- 数据库连接问题:检查application配置文件中的数据库URL、账号密码是否正确,目标数据库是否正常运行、服务器能否访问
- 文件权限不足:确认Tomcat进程对
webapps、temp、logs目录有读写权限,手动解压WAR包试试能否正常读取内容 - 第三方服务依赖:如果应用启动时需要连接Redis、MQ等外部服务,检查这些服务是否可用
- 端口冲突:用
netstat -tulpn | grep 80确认80端口是否被其他进程占用
3. 优化Tomcat启动参数和日志
- 日志里显示
-Djava.security.egd=file:/dev/./urandom被重复添加了,建议在catalina.sh中只保留一次,避免参数冲突 - 开启Tomcat的DEBUG级日志,修改
conf/logging.properties,添加:
这样能看到部署过程中的详细步骤,更容易定位卡点org.apache.catalina.startup.HostConfig.level = FINEST org.apache.catalina.startup.HostConfig.handlers = java.util.logging.ConsoleHandler - 尝试调整内存参数,把
-Xmx1024M提升到-Xmx2048M,避免内存不足导致的启动卡顿
4. 手动解压WAR包测试
先把ROOT.war手动解压到webapps/ROOT目录,再启动Tomcat,排除WAR包损坏的可能:
cd /home/tomcat/webapps unzip ROOT.war -d ROOT
启动后观察日志,看是否会出现更明确的报错信息
内容的提问来源于stack exchange,提问作者Hiren
相关产品推荐
相关产品推荐

