SpringBoot项目以war包形式部署至外部tomcat

步骤1:继承SpringBootServletInitializer

外部容器部署的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法

package com.test.chaosblade;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * @description:
 * @time: 2020-08-28 15:49
 */
@SpringBootApplication(exclude = {
    
     DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, SecurityAutoConfiguration.class })
public class ChaosbladeApplication extends SpringBootServletInitializer {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(ChaosbladeApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    
    
        return builder.sources(this.getClass());
        //此处的ChaosbladeApplication是springboot启动类
    }
}

备注:
该类与在web.xml中配置负责初始化Spring应用上下文的监听器作用类似,但却避免了编写额外的XML文件的麻烦

步骤2:pom.xml修改tomcat相关配置

如果要将项目打成war包,部署到外部tomcat的话,需要修改pom.xml文件。引入的spring-boot-starter-web包含了内嵌的tomcat容器,如果直接部署在外部tomcat的话会造成冲突报错。针对这个问题,可以采用以下两种方式解决:

方法1:排除内嵌tomcat
这样打出的war包中,其lib目录下才不会包含Tomcat相关的jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

由于SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有javax.servlet。tomcat-embed-jasper中scope必须是provided,provided的作用可以看我的XXXX文章。如果没用provided,那么最终打好的war里面就会有servlet-api这个jar,这样就会与tomcat本身的产生冲突

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

方法2:增加配置
spring-boot-starter-tomcat是Spring Boot默认就会配置的,将其设置为provided的目的是为了在打包时将该包(依赖)排除

<!--部署成war包时开启【同时支持war和jar启动部署】↓↓↓↓-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>                
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<!--部署成war包时开启【同时支持war和jar启动部署】↑↑↑↑-->

步骤3:pom.xml设置打war包

<packaging>war</packaging>

⚠️注意:

  1. 项目名称和打包名称需要保持一致
    如果不一致的话,项目发布到webapps目录下后上下文会变化
<build>
    <finalName>demo</finalName>
</build>

猜你喜欢

转载自blog.csdn.net/sinat_34241861/article/details/115290040