Spring Boot 打 war 包

使用Spring Boot时通常打的是jar包,如果开发的是Web应用也通常使用内置的Web容器,比如Tomcat。那如果要打war包应该怎么办呢?

1.首先需要把Maven的pom.xml中的package改为war。

<packaging>war</packaging>

2.拿掉spring-boot-maven-plugin插件,因为我们已经不需要repackage了。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3.打war时内置的Web容器相关的jar就不再需要了,以免部署到外部容器时产生影响。所以当我们使用内置的Tomcat时,我们需要调整Tomcat的依赖的scope为provided。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

4.调整Java Application启动类使其继承SpringBootServletInitializer,并重写其configure方法,重写时调用入参SpringApplicationBuilder的sources方法,并传递配置类作为参数,比如下面这样。这样在开发的时候可以继续以Java Application的方式运行,部署的时候就打war包部署,打war包部署启动时基于Servlet3的ServletContainerInitializer规范将最终会通过下面的Application类来启动Spring Boot的相关内容。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(Application.class);
  }
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

通过以上几步Spring Boot应用就可以打成war包部署到外部Web容器中,运行出来的效果跟打jar包运行的效果是一样的。