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

背景

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

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

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

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

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

问题描述

我修改pom.xml将打包方式改成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.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下面那肯定是不能用啊

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

<properties>
 <tomcat.version>7.0.69</tomcat.version>
</properties>

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

<dependency>
 <groupId>org.apache.tomcat</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中的方式

这里有两种方式可选择:

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

<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库(强烈推荐这种方式!!)

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

(0)

相关推荐

  • springboot项目打成war包部署到tomcat遇到的一些问题

    开发环境使用jdk1.8.0_60,把springboot 项目打成war包后, 部署到apache-tomcat-7.0.68时报错如下,换成apache-tomcat-8.0.9解决 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/my-springboot-web-0.0.1

  • 如何把spring boot项目部署到tomcat容器中

    把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二.移除嵌入式tomcat插件 在pom.xml里找到spring-boot-starter-web依赖节点,在其中添加如下代码, <dependency> <groupId>org.springframework.boot</groupId> <artifactId&

  • Spring Boot 项目发布到 Tomcat 服务器的操作步骤

    第 1 步:将这个 Spring Boot 项目的打包方式设置为 war. <packaging>war</packaging> SpringBoot 默认有内嵌的 tomcat 模块,因此,我们要把这一部分排除掉. 即:我们在 spring-boot-starter-web 里面排除了 spring-boot-starter-tomcat ,但是我们为了在本机测试方便,我们还要引入它,所以我们这样写: <dependency> <groupId>org.s

  • SpringBoot 创建web项目并部署到外部Tomcat

    前言 使用SpringBoot来开发项目相对于传统模式,要快速优雅许多,相信目前国内绝大部分web项目的开发还没有使用SpringBoot来做,如果你正需要开发一个web项目,不妨尝试使用SpringBoot来做. 本身SpringBoot是内嵌了web服务器,不需要单独的Tomcat,但是实际生产环境中,如果是web项目,Tomcat肯定是运维部门部署好了的,这个Tomcat,做了一些个性化的设置,开发出来的项目需要部署到这个Tomcat,如果是使用SpringBoot开发web服务,我认为可

  • Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embeddedServletContainer; ServletContext localServletContext = getServ

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

    背景 最近公司在做一些内部的小型Web应用时, 为了提高开发效率决定使用SpringBoot, 这货自带Servlet容器, 你在开发Web应用时可以直接在本地像运行控制台应用一样启动,省去了重复部署的时间:配置上相比于SpringMVC也是有了大大的简化.SpringBoot的应用可以直接打成一个可运行的jar包, 你无需发愁为了不同应用要部署多个Tomcat.但是实际部署时你会发现打成Jar包的方式有一个致命的缺点, 当你改动了一个资源文件.或者一个类时, 打要往服务器重新上传全量jar包.

  • 在idea中将创建的java web项目部署到Tomcat中的过程图文详解

    在idea中将创建的java web项目部署到Tomcat中 采用的工具idea 2018.3.6 Tomcat7 1.先创建第一个新项目secondweb(注意勾选JavaEE下的web Application(4.0),窗口下的version对应为4.0,并且保证create web.xml已经被勾选) 2.在创建好的web项目的web/WEB-INF目录下创建两个文件夹:classes和lib.classes用来存放编译后输出的class文件,lib用来存放第三方jar包(下图显示的是创建

  • idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    目录 前言 解决方法: 方法一: 方法二: 方法三: 方法四: 总结 前言 很多人在idea中启动项目时会出现控制台的中文乱码,其实也无伤大雅,但是本人看着不舒服所以在网上查找了一些方法和各位分享一下 解决方法: 方法一: 1.打开tomcat配置页面,Edit Configurations. 2.选择项目部署的tomcat,在配置项VM options输入框中输入-Dfile.encoding=UTF-8,点击Apply或OK即可. 3.修改idea设置里的文件编码格式为utf-8. 我修改了

  • 腾讯云服务器tomcat端口无法访问的解决方法

    最近用腾讯云配置了服务器,在使用的时候发现tomcat端口无法访问,所以在网上找了点资料,一共有两种情况,下面总结一下,希望对大家有所帮助,也给自己留个笔记. 第一种情况: 如题:https://console.cloud.tencent.com/cvm/securitygroup需要去这个地址设置安全组. 说实话,一句mmp不知当讲不当讲.使用说明这块太乱了. 当然更改了安全组和防火墙还是不行.于是我查看Tomcat的记录,发现: /home/apache-tomcat-8.5.37/bin/

  • 有关tomcat内存溢出的完美解决方法

    tomcat内存溢出设置JAVA_OPTS 答案1 设置Tomcat启动的初始内存 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn -Xms -Xmx等选项可 进行设置 三.实例,以下给出1G内存环境下java jvm 的参数设置参考: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -D

  • springboot 高版本后继续使用log4j的完美解决方法

    springboot  高版本后不支持log4j了,很多人还是喜欢log4j风格的日志,我们自己来加载log4j,其实很容易. 第一步:我们手动加入我们想要的log4j jar,在项目里面随便建一个文件夹,将用到的jar丢进去,右键 add to build path 第二步: 在main函数启动类所在的包或者其子包下写一个这样的类,用来加载log4j配置文件,是的,什么内容都没有. import org.springframework.boot.context.properties.Confi

  • Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法

    mysql数据库版本从5.6.28升到8.0.11过程中部署项目时遇到的问题和解决方法,具体介绍如下所示: 首先这个项目用到了hibernate4.2.0,链接mysql5.6.28没问题,换到8.0.11,启动报错 1.Caused by: org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 报错就配置吧 启动项目不报错了,但是访问项目报错了 2.访问报错com

  • idea日志乱码和tomcat日志乱码问题的解决方法

    1 idea启动tomcat乱码 遇到的问题: idea整合SSM项目,tomcat启动,启动时查看idea上的tomcat日志,出现乱码: 但是直接用tomcat 的 startup.bat启动,无乱码: 2,出现的原因: 查看tomcat/conf/logging.properties java.util.logging.ConsoleHandler.encoding = GBK 而本window系统使用的也是GBK编码,所以直接使用bat文件启动正常,但是idea上配置的是UTF-8,所以

  • SpringBoot多数据源读写分离的自定义配置问题及解决方法

    目录 针对device库我们先创建一个数据库连接配置类 在类中添加配置文件中的读写数据源 创建返回SqlSessionFactory的Bean 创建SqlSessionTemplate的Bean 创建DataSourceTransactionManager 事务管理器 最后 在开发中我们有可能会遇到一个项目需要配置多个数据源,或者需要读写分离的配置,在启动类上贴上@MapperScan注解指定扫描对应的mapper.xml文件肯迪那个是无法满足了.我们可以通过自定义配置数据库配置类来解决这个问题

  • SQL服务器无法启动的解决方法

    系统用户administrator 密码改变后,注销重新登录,发现SQL Server没有随机启动.手动从服务管理器中启动,提示"由于登录失败而无法启动服务". 原因: 安装SQL Server时是使用默认登录用户来作为启动SQL Server服务的账号(对于自己使用的单机,通常就是administrator),当该用户更改了用户名(如把administrator改成admin)或更改了其口令时,再次启动服务器,就出现"同于登录失败而无法启动服务"的错误了. 解决方

随机推荐