通过Maven将SpringBoot打包,发布到Tomcat时,报如下错误:
严重: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/springbootajax-0.0.1-SNAPSHOT]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1095)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1930)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager;
at org.apache.tomcat.websocket.WsWebSocketContainer.<clinit>(WsWebSocketContainer.java:77)
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:5506)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 10 more
在本机IDEA中,项目是可以跑起来的,没有问题,为什么发布到Tomcat就报错了呢,机器也没换,环境变量等等都一样,唯一不一样的就是Tomcat!!!考虑是否跟Tomcat版本不一样有关
一、首先我们查看Spring自带Tomcat的版本,可以通过以下两种方式查看:
1、通过页面查询
比如我们需要查Spring Boot 1.4.0-RELEASE的内嵌Tomcat版本, 可以打开链接:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat/1.4.0.RELEASE,在该页面可以看到SpringBoot最新版本是2.1.7(红色标记部分),你要查询的版本对应的Tomcat(下图蓝色标记部分),1.4.0对应的Tomcat版本是8.5.4,黄色标记部分1.4.0是当前查询的SpringBoot版本号
2、通过IDEA工具查看
我的SpringBoot版本内置的Tomcat是8.5.4,而我将项目打包发布到Tomcat7,就出现了文章开头的报错。
二、指定SpringBoot内置的Tomcat版本
排除SpringBoot的Tomcat,指定Tomcat版本
有时候我们需要在特定情况下使用特定的Tomcat版本,这时候总不能因为Tomcat就改变SpringBoot的版本,所以可以采用排除SpringBoot中的Tomcat包,然后手动指定Tomcat的版本,当然还要引入Tomcat相关的包。
Maven的配置
在 pom.xml文件里面添加一个标签<properties>
,添加期望的版本。
<tomcat.version>7.0.64</tomcat.version>(改为自己的Tomcat版本号)
添加JAR包
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>