SpringBoot应用部署到Tomcat中无法启动的解决方法
发布时间 - 2026-01-11 03:09:59 点击率:次背景

最近公司在做一些内部的小型Web应用时, 为了提高开发效率决定使用SpringBoot, 这货自带Servlet容器,
你在开发Web应用时可以直接在本地像运行控制台应用一样启动,省去了重复部署的时间;配置上相比于SpringMVC也是有了大大的简化。SpringBoot的应用可以直接打成一个可运行的jar包,
你无需发愁为了不同应用要部署多个Tomcat。但是实际部署时你会发现打成Jar包的方式有一个致命的缺点,
当你改动了一个资源文件、或者一个类时, 打要往服务器重新上传全量jar包。比如网速慢的公司(比如我们)来说, 那简直是不能忍受的!!!
还好SpringBoot也支持打包成普通的war包,这样你本地开发环境直接用控制台方式运行,部署到服务器时打成普通war包部署。这样既享受到了SpringBoot开发带来的快感,又避免了增量部署不方便的问题。可谓两全其美。 不过在打成War包时, 我也遇到了一些问题
问题描述
我修改pom.xml将打包方式改成war
<packaging>war</packaging>
完事儿打完包以后, 放到我本地Tomcat上跑了跑,发现没问题。但是部署到服务器上的Tomcat以后, 发现无法启动,错误如下:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[ /report]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:150) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5573) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) ... 10 more
明显不是应用代码错误,猜想应该是环境问题。经过分析, 我本地的Tomcat版本是8.0.28, 而服务器上的Tomcat是7.0.69。 我在本地下了个Tomcat7.0.70部署也报同样错误。更加确定问题跟Tomcat版本有关。经过多方查找资料,最后在Stackoverflow上看到一个老外说SpringBoot默认Servlet容器是基于Tomcat8的
在打好的war包中确实发现了Tomcat相关jar包,而且是Tomcat8的,拿Tomcat8的embed包在Tomcat7下面那肯定是不能用啊
要支持低版本Tomcat需要在maven中指定Tomat版本,配置如下:
<properties> <tomcat.version>7.0.69</tomcat.version> </properties>
然后依赖中加上(这个其实不加也行, 官方文档是加上的)
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
加上以后试了下,果然是没问题了。看了下war包中的lib目录,确实已经变成Tomcat7的包了
但是我还是有点疑惑, 这样配置打成包岂不是换个Tomcat版本就要重新打次包? 既然是由于SpringBoot内部的Servlet容器造成了这个限制, 那我不用行不行? 又查了很多资料, 还真有办法!
<!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
试了下, 加上这个后, 上面说Tomcat的版本无需指定了, 耶! ^_^
总结
总结下SpringBoot应用部署到Tomcat下的配置方法用于备忘也方便遇到同样问题的朋友
将打包方式改成war
这个没啥好说的, 肯定要改成war
配置嵌入Tomcat中的方式
这里有两种方式可选择:
方式一:用spring-boot内置的tomcat库, 并指定你要部署到Tomcat的版本
<properties>
<tomcat.version>7.0.69</tomcat.version>
</properties>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
方式二:不用spring-boot内置的tomcat库(强烈推荐这种方式!!)
<!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
maven-war-plugin (可选)
与maven-resources-plugin类似,当你有一些自定义的打包操作, 比如有非标准目录文件要打到war包中或者有配置文件引用了pom中的变量。 具体用法参见官方文档:http://maven.apache.org/components/plugins/maven-war-plugin/
总结
以上所述是小编给大家介绍的SpringBoot应用部署到Tomcat中无法启动的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# spring
# boot
# 部署tomcat无法启动
# 如何把spring boot项目部署到tomcat容器中
# Springboot打成war包并在tomcat中运行的部署方法
# SpringBoot war包部署到Tomcat服务器
# Spring Boot打包war jar 部署tomcat
# SpringBoot应用部署于外置Tomcat容器的方法
# 将SpringBoot项目无缝部署到Tomcat服务器的操作流程
# Spring Boot通过tomcat部署项目(包含jar包、war包)的完整过程
# 当你
# 包中
# 可以直接
# 此项
# 试了
# 小编
# 无法启动
# 器上
# 我也
# 文档
# 我在
# 看了
# 多个
# 你要
# 在此
# 如有
# 你在
# 下了
# 两全其美
# 那我
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高端建站如何打造兼具美学与转化的品牌官网?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
高性能网站服务器部署指南:稳定运行与安全配置优化方案
音乐网站服务器如何优化API响应速度?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何在阿里云域名上完成建站全流程?
Laravel怎么判断请求类型_Laravel Request isMethod用法
在线教育网站制作平台,山西立德教育官网?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Swift中循环语句中的转移语句 break 和 continue
bing浏览器学术搜索入口_bing学术文献检索地址
焦点电影公司作品,电影焦点结局是什么?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Java遍历集合的三种方式
JavaScript常见的五种数组去重的方式
Laravel如何配置Horizon来管理队列?(安装和使用)
如何快速上传建站程序避免常见错误?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何在云主机上快速搭建网站?
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel定时任务怎么设置_Laravel Crontab调度器配置
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何在香港服务器上快速搭建免备案网站?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
免费视频制作网站,更新又快又好的免费电影网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何在Windows服务器上快速搭建网站?
javascript读取文本节点方法小结
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在VPS电脑上快速搭建网站?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
太平洋网站制作公司,网络用语太平洋是什么意思?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】

