用来记录一些原创性的总结
使用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包运行的效果是一样的。
(注:本文基于Spring Boot 2.0.3所写)