Spring Boot 一個非常方便的功能就是支持內置的 Servlet 容器,一般我們部署 Spring Boot 應用時都是打成一個可執行的 Jar 包進行部署。其實 Spring Boot 也是支持打成傳統的 war 包部署的。肯定有人問:既然 Jar 包簡單又方便,為什么還要 用 war 包部署呢?其實我就是自己折騰下,哈哈~
需要注意的是,假如你的應用使用了 Spring 的 WebFlux 功能,那么是不支持 war 包部署的。
配置調整
1. 修改 pom.xml 中的打包方式
<packaging>war</packaging>
2. 調整依賴
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 該包只在編譯和測試的時候使用 -->
<scope>provided</scope>
</dependency>
3. 繼承 SpringBootServletInitializer
@SpringBootApplication
public class AppQuickStart extends SpringBootServletInitializer {
private static Logger logger = LoggerFactory.getLogger(AppQuickStart.class);
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
logger.info("app begin to start...");
SpringApplication.run(AppQuickStart.class, args);
logger.info("app start success...");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AppQuickStart.class);
}
}
4. 一些其他注意點
下面是 build 的配置,主要是設置了應用的名稱,還用就是加了maven-war-plugin
這個插件,不然會報找不到web.xml
這個錯誤。
<build>
<finalName>appName</finalName>
<!-- 省略其他配置 -->
<plugins>
<plugin>
<configuration>
<excludeDevtools>true</excludeDevtools>
</configuration>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
好了,到此就可以執行mvn clean install
命令打包了。
報 404 問題
網上有很多文章說 Spring Boot 應用打成 war 部署 Tomcat 后訪問接口會報 404 錯誤。如果你是完全上面的步驟配置的不應該會有問題。
假如真的有問題,建議從下面幾方面來解決:
- URL 有沒有寫對:部署 Tomcat 后是需要填寫 context-path 的,這個 context-path 並不是 Spring Boot 中配置的,而是 Tomcat 中配置的,如果你沒對 Tomcat 做特殊的配置,那么這個 context-path 就是你打包好的項目的名稱;
- 檢查接口參數有沒傳對;
- 終極辦法,打開日志的 Dubug 級別,一般問題都能看出來,如果你日志是 info 級別,你的全局異常處理沒做到位,有些異常是看不出來的。
說明
本文基於 Tomcat 9 和 Spring Boot 2.0.0.Release 版本