SpringBoot项目部署到Tomcat时重复启动的解决方法
一、使用内嵌Tomcat打成jar包的形式部署
SpringBoot项目部署在linux系统上时,通过启动脚本启动项目时,启动完成后接着重复启动,然后一直循环下去!
解决办法是在配置文件中添加这个配置:
spring.devtools.restart.enabled=false
二、以war包形式部署到外部Tomcat
1、SptingBoot项目的原因
1、未排除SpringBoot内嵌的Tomcat
// 项目为war形式
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去除内嵌tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
二、Tomcat配置的原因
问题发生的环境:
在Tomcat的默认的server.xml里面,错误的配置了Host或者Context标签
例如下面的配置就会导致Tomcat重复加载项目:web-sys
在server.xml里配置:
<Host name="www.xxx.com" appBase="webapps" autoDeploy="true" unpackWARs="true">
<Alias>www.xxx.cn</Alias>
<Alias>www.xxx.com.cn</Alias>
<Context docBase="web-sys" path=""/>
</Host>
问题发生的原因:
根据server.xml里配置的,Tomcat首先根据Context的配置内容生成第一个StandardContext对象,加载一次项目。然后再根据Host/appBase的配置对webapps下面的项目(web-sys)生成第二个StandardContext,再加载一次项目。Tomcat针对同一项目生成两个StandardContext的原因就是因为他们的名字不同,Tomcat认为是两个Context,所以加载了两次。而他们的名字是谁决定的呢?第一个StandardContext的名字是由标签:Context的配置来决定的,而第二个StandardContext的名字是由项目名称(web-sys)决定的。
解决办法:
其实server.xml的Context标签有一个隐藏属性:name,只需要把此name设置为项目名称就可避免重复加载的问题。
例如下面的配置:
<Host name="www.xxx.com" appBase="mywebapps" autoDeploy="true" unpackWARs="true">
<Alias>www.xxx.cn</Alias>
<Alias>www.xxx.com.cn</Alias>
<Context docBase="web-sys" path="" name="/web-sys"/>
</Host>
注意:在server.xml里有默认的Host(localhost)的配置,这个配置里会加载Tomcat的一些默认项目。如果想保留这个配置,又想为自己的项目配置域名,那么就必须新增一个host,并且appBase不能设置为:webapps(可以新建一个同级目录的文件夹用来存放项目,例如上面配置的appBase=“mywebapps”)。
更多推荐
所有评论(0)