springboot的应用打包默认是打成jar包,并且如果是web应用的话,默认使用内置的tomcat充当servlet容器,但内置的tomcat有时候并不满足我们的需求,当我们需要把springboot的jar应用打包成war包并在外部tomcat中部署时,默认的设置就需要更改了。
          习惯SSM开发的同学可能会疑惑,不是直接打成war包然后扔到到tomcat的webapp下就行了的吗?然而,springboot默认的设置是:如果在类路径下有tomcat相关类文件,就会以内置tomcat进行启动,不管你是不是把war包扔到外置的tomcat下启动。
          要把springboot应用打包成war包并且能够在外部tomcat下启动,需要对项目进行以下改造:
  1、在pom.xml文件中把打包方式改成war
     <packaging>war</packaging>
  
  2、添加maven的war打包插件如下
          <warName>可以给war包起个好名字,方便部署后访问使用。
          该配置可忽略,默认的打包名称为"name-1.0-SNAPSHOT",其中的name是项目(文件夹)名称。
          使用<warName>给war包起名字后,其实是把打包结果复制了一份并根据该名字重命名了而已,默认打的war包依然可以在打包路径找到。
     <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-war-plugin</artifactId>
     <configuration>
         <warName>infrastructure</warName>
     </configuration>
 </plugin>
  
   
  3、排除org.springframework.boot的web依赖中的tomcat内置容器
     <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   <!-- 这里面包含org.slf4j,版本:1.6.4;和com.fasterxml.jackson.core,版本:2.8.10 -->
     <exclusions>
         <exclusion>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-tomcat</artifactId>
         </exclusion>
     </exclusions>
 </dependency>
  
  
 4、继承SpringBootServletInitializer 
          在SpringBoot的启动类中,继承SpringBootServletInitializer类。
          该类是SpringBoot专门为使用非内置tomcat启动时,用于指定并初始化资源的。
          例子如下:
     @SpringBootApplication
 public class Application extends SpringBootServletInitializer {
       public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
     }
   }
  
  5、依赖 javax.servlet API
          使用过SSM架构并打包war包的同学肯定也都知道这一步也是必不可少的
     <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>${servlet-api.version}</version>
     <scope>provided</scope>
 </dependency>
  
          经过上述步骤的改造后,Spring Boot 项目打包成war包后,就可以直接放在tomcat部署了。