生成可部署war文件的第一步是提供SpringBootServletInitializer子类并覆盖其configure方法。 这充分利用了Spring Framework对于Servlet 3.0的支持,并允许你在servlet容器启动时配置应用程序。 通常,改变应用程序主类以扩展SpringBootServletInitializer:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
下一步是更新构建配置,以便项目生成war文件而不是jar文件。 如果使用Maven并使用spring-boot-starter-parent(它配置Maven的war插件),修改pom.xml将<packaging>更改为war:
<!-- <packaging>jar</packaging> -->
<packaging>war</packaging>
最后一步是确保嵌入式servlet容器不会干扰将部署war文件的servlet容器。 为此,需要标记所提供的嵌入式servlet容器依赖项。
<dependencies>
<!-- … -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- … -->
</dependencies>
如果正在使用SpringBoot构建工具,则标记所提供的嵌入式servlet容器依赖项将生成一个可执行war文件,其中提供的依赖项打包在lib目录中。 这意味着,除了可部署到servlet容器之外,还可以在命令行上使用java -jar运行应用程序。
记录打包步骤:
1. 修改pom.xml
(1)打包方式jar修改为war
<!-- <packaging>jar</packaging> -->
<packaging>war</packaging>
(2)使用外置的tomcat相关jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
(3)maven插件
<finalName/>标签用于指定war包名称,默认命名规则:<groupId>-<artifactId>.war
<build>
<finalName>test</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(4) 跳过测试
<properties>
...
<!-- maven方式跳过maven test, 等同$ mvn package -Dmaven.test.skip=true -->
<!-- <maven.test.skip>true</maven.test.skip> -->
<!-- surefire plugin方式跳过maven test,等同$ mvn package -DskipTests -->
<skipTests>true</skipTests>
</properties>
2. 新建类ServletInitializer
该类继承SpringBootServletInitializer,与启动类放置同一级;重写configure方法,因为需要类似于web.xml配置方式来启动Spring上下文。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// SpringBoot启动类
return builder.sources(Application.class);
}
}
3. 修改启动类Application
@ServletComponentScan注解用于扫描Servlet、Filter等,否则不起作用
@ServletComponentScan("com.momo.springboot.config.servlet")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4.打包
idea点击package(在生命周期的package阶段执行插件的目标),在项目/target目录下可以找到打包好的war包