全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

SpringBoot应用部署到Tomcat中无法启动的解决方法

背景

最近公司在做一些内部的小型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包)的完整过程  # 当你  # 包中  # 可以直接  # 此项  # 试了  # 小编  # 无法启动  # 器上  # 我也  # 文档  # 我在  # 看了  # 多个  # 你要  # 在此  # 如有  # 你在  # 下了  # 两全其美  # 那我 


相关文章: 建站之星客服服务时间及联系方式如何?  php json中文编码为null的解决办法  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何通过虚拟主机空间快速建站?  如何快速搭建FTP站点实现文件共享?  如何用PHP工具快速搭建高效网站?  建站之星代理如何获取技术支持?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何在阿里云完成域名注册与建站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何选择服务器才能高效搭建专属网站?  招贴海报怎么做,什么是海报招贴?  ,网页ppt怎么弄成自己的ppt?  建站主机服务器选购指南:轻量应用与VPS配置解析  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  香港网站服务器数量如何影响SEO优化效果?  网站制作话术技巧,网站推广做的好怎么话术?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  建站之星安装需要哪些步骤及注意事项?  建站之星官网登录失败?如何快速解决?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  定制建站方案优化指南:企业官网开发与建站费用解析  小型网站建站如何选择虚拟主机?  宁波自助建站系统如何快速打造专业企业网站?  如何做网站制作流程,*游戏网站怎么搭建?  实例解析angularjs的filter过滤器  教学论文网站制作软件有哪些,写论文用什么软件 ?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星安装模板失败:服务器环境不兼容?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  c# 服务器GC和工作站GC的区别和设置  如何在橙子建站上传落地页?操作指南详解  建站之星如何保障用户数据免受黑客入侵?  无锡营销型网站制作公司,无锡网选车牌流程?  Swift中switch语句区间和元组模式匹配  建站之星后台密码遗忘或太弱?如何重置与强化?  Swift开发中switch语句值绑定模式  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在阿里云通过域名搭建网站?  nginx修改上传文件大小限制的方法  如何在Ubuntu系统下快速搭建WordPress个人网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何在服务器上配置二级域名建站?  南京网站制作费用,南京远驱官方网站?  如何在橙子建站中快速调整背景颜色?  临沂网站制作企业,临沂第三中学官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。