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需要在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内部的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应用无法启动如何解决