Tomcat中SpringBoot应用无法启动如何解决

  

Tomcat中SpringBoot应用无法启动如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>问题描述

我修改砰的一声。xml将打包方式改成战争

& lt; packaging> war

完事儿打完包以后,放到我本地Tomcat上跑了跑,发现没问题。但是部署到服务器上的Tomcat以后,发现无法启动,错误如下:

org.apache.catalina。LifecycleException:未能启动组件(StandardEngine(卡特琳娜).StandardHost (localhost) .StandardContext (/报告]]   org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java: 153)   org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java: 899)   org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java: 875)   org.apache.catalina.core.StandardHost.addChild (StandardHost.java: 652)   org.apache.catalina.startup.HostConfig.deployWAR (HostConfig.java: 1092)   org.apache.catalina.startup.HostConfig DeployWar.run美元(HostConfig.java: 1984)   java.util.concurrent.Executors RunnableAdapter.call美元(Executors.java: 471)   java.util.concurrent.FutureTask.run (FutureTask.java: 262)   java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1145)   java.util.concurrent.ThreadPoolExecutor Worker.run美元(ThreadPoolExecutor.java: 615)   java.lang.Thread.run (Thread.java: 745)   引起的:. lang。NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName () Ljava/lang/String;   在org.apache.tomcat.websocket.server.WsServerContainer灵活;init> (WsServerContainer.java: 150)   org.apache.tomcat.websocket.server.WsSci.init (WsSci.java: 131)   在org.apache.tomcat.websocket.server.WsSci.onStartup (WsSci.java: 47)   org.apache.catalina.core.StandardContext.startInternal (StandardContext.java: 5573)   org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java: 147)   …10

明显不是应用代码错误,猜想应该是环境问题。经过分析,我本地的Tomcat版本是8.0.28,而服务器上的Tomcat是7.0.69。我在本地下了个Tomcat7.0.70部署也报同样错误。更加确定问题跟Tomcat版本有关。经过多方查找资料,最后在Stackoverflow上看到一个老外说SpringBoot默认Servlet容器是基于Tomcat8的

在打好包的战争中确实发现了Tomcat相关jar包,而且是Tomcat8的,拿Tomcat8的嵌入包在Tomcat7下面那肯定是不能用啊

 Tomcat中SpringBoot应用无法启动如何解决

要支持低版本Tomcat需要在maven中指定番茄酱版本,配置如下:

& lt; properties>   & lt; tomcat.version> 7.0.69   & lt;/properties>

然后依赖中加上(这个其实不加也行,官方文档是加上的)

& lt; dependency>   & lt; groupId> org.apache.tomcat   & lt; artifactId> tomcat-juli   & lt; version> $ {tomcat.version} & lt;/version>   & lt;/dependency>

加上以后试了下,果然是没问题了。看了下战争包中的自由目录,确实已经变成Tomcat7的包了

 Tomcat中SpringBoot应用无法启动如何解决

但是我还是有点疑惑,这样配置打成包岂不是换个Tomcat版本就要重新打次包?既然是由于SpringBoot内部的Servlet容器造成了这个限制,那我不用行不行?又查了很多资料,还真有办法!

& lt; !——打战争包时加入此项,告诉spring-boot tomcat相关的jar包用外部的,不要打进去——比;   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-tomcat   & lt; scope> provided   & lt;/dependency>

试了下,加上这个后,上面说Tomcat的版本无需指定了,耶!^ _ ^

总结下SpringBoot应用部署到Tomcat下的配置方法用于备忘也方便遇到同样问题的朋友

将打包方式改成战争

这个没啥好说的,肯定要改成战争

这里有两种方式可选择:

方式一:用spring-boot内置的Tomcat库,并指定你要部署到Tomcat的版本

& lt; properties>   & lt; tomcat.version> 7.0.69   & lt;/properties>   & lt; dependency>   & lt; groupId> org.apache.tomcat   & lt; artifactId> tomcat-juli   & lt; version> $ {tomcat.version} & lt;/version>   & lt;/dependency>

Tomcat中SpringBoot应用无法启动如何解决