服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot应用部署到Tomcat中无法启动的解决方法

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

2020-12-30 11:31晨之风 Java教程

这篇文章主要介绍了SpringBoot应用部署到Tomcat中无法启动的解决方法,需要的朋友可以参考下

背景

最近公司在做一些内部的小型web应用时, 为了提高开发效率决定使用springboot, 这货自带servlet容器,

你在开发web应用时可以直接在本地像运行控制台应用一样启动,省去了重复部署的时间;配置上相比于springmvc也是有了大大的简化。springboot的应用可以直接打成一个可运行的jar包,

你无需发愁为了不同应用要部署多个tomcat。但是实际部署时你会发现打成jar包的方式有一个致命的缺点,

当你改动了一个资源文件、或者一个类时, 打要往服务器重新上传全量jar包。比如网速慢的公司(比如我们)来说, 那简直是不能忍受的!!!

还好springboot也支持打包成普通的war包,这样你本地开发环境直接用控制台方式运行,部署到服务器时打成普通war包部署。这样既享受到了springboot开发带来的快感,又避免了增量部署不方便的问题。可谓两全其美。 不过在打成war包时, 我也遇到了一些问题

问题描述

我修改pom.xml将打包方式改成war

?
1
<packaging>war</packaging>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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下面那肯定是不能用啊

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

要支持低版本tomcat需要在maven中指定tomat版本,配置如下:

?
1
2
3
<properties>
 <tomcat.version>7.0.69</tomcat.version>
</properties>

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

?
1
2
3
4
5
<dependency>
 <groupid>org.apache.tomcat</groupid>
 <artifactid>tomcat-juli</artifactid>
 <version>${tomcat.version}</version>
</dependency>

加上以后试了下,果然是没问题了。看了下war包中的lib目录,确实已经变成tomcat7的包了

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

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

?
1
2
3
4
5
6
<!-- 打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的版本

?
1
2
3
4
5
6
7
8
<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库(强烈推荐这种方式!!)

?
1
2
3
4
5
6
<!-- 打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中无法启动的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.csdn.net/asdfsfsdgdfgh/article/details/52127562

延伸 · 阅读

精彩推荐