Spring Boot 內嵌 Tomcat 方便開發測試,但生產環境常需部署到獨立的 Tomcat 實例。本文詳細說明從修改打包方式、排除內嵌容器、添加 Servlet API 依賴、改造啟動類到最終打包部署的完整流程。
<packaging>war</packaging>
<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>
<!-- 方案一:官方 Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 方案二:Tomcat 提供的 Servlet API -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>
provided 作用域表示編譯時需要,運行時由容器提供,不會打入 WAR。
SpringBootServletInitializer原有主類保持不變:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
新增一個啟動適配類:
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
此類會被 Servlet 容器自動發現並調用 configure,完成 Spring 上下文初始化。
mvn clean package[INFO] BUILD SUCCESS,WAR 文件生成在 target/ 目錄webapps/ 目錄bin/startup.sh 或 startup.bat),容器自動解壓部署瀏覽器輸入:
https://localhost:8080/<項目名>/
若配置了 server.servlet.context-path,需加上上下文路徑。
server.servlet.context-pathservlet-api 僅以 provided 引入,避免與容器自帶 JAR 衝突SpringBootStartApplication 中添加 @EnableWebMvc 並繼承 WebMvcConfigurer 配置資源處理器完成上述步驟,Spring Boot 應用即可像傳統 WAR 包一樣部署到任何兼容 Servlet 3.0+ 的容器中,實現開發與生產環境的無縫切換。