SpringBoot应⽤部署到Tomcat中⽆法启动的解决⽅法背景
最近公司在做⼀些内部的⼩型Web应⽤时,为了提⾼开发效率决定使⽤SpringBoot,这货⾃带Servlet容器,
你在开发Web应⽤时可以直接在本地像运⾏控制台应⽤⼀样启动,省去了重复部署的时间;配置上相⽐于SpringMVC也是有了⼤⼤的简化。SpringBoot的应⽤可以直接打成⼀个可运⾏的jar包,
你⽆需发愁为了不同应⽤要部署多个Tomcat。但是实际部署时你会发现打成Jar包的⽅式有⼀个致命的缺点,
当你改动了⼀个资源⽂件、或者⼀个类时,打要往服务器重新上传全量jar包。⽐如⽹速慢的公司(⽐如我们)来说,那简直是不能忍受的
还好SpringBoot也⽀持打包成普通的war包,这样你本地开发环境直接⽤控制台⽅式运⾏,部署到服务器时打成普通war包部署。这样既享受到了SpringBoot开发带来的快感,⼜避免了增量部署不⽅便的问题。可谓两全其美。不过在打成War包时,我也遇到了⼀些问题
问题描述
我修改l将打包⽅式改成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.ContainerBase.addChildInternal(ContainerBase.java:899)
at org.ContainerBase.addChild(ContainerBase.java:875)
at org.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 urrent.Executors$RunnableAdapter.call(Executors.java:471)
at urrent.FutureTask.run(FutureTask.java:262)
at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: javax.VirtualServerName()Ljava/lang/String;
at at.websocket.server.WsServerContainer.<init>(WsServerContainer.java:150)
at at.websocket.server.WsSci.init(WsSci.java:131)
at at.websocket.Startup(WsSci.java:47)
at org.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>at</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中的⽅式
springboot是啥
这⾥有两种⽅式可选择:
⽅式⼀:⽤spring-boot内置的tomcat库,并指定你要部署到Tomcat的版本
<properties>
<tomcat.version>7.0.69</tomcat.version>
</properties>
<dependency>
<groupId>at</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 (可选)
总结
以上所述是⼩编给⼤家介绍的SpringBoot应⽤部署到Tomcat中⽆法启动的解决⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!