背景:最近在使用SpringBoot項目過程中,代碼寫好測試完,部署到伺服器上啟動使用外置的tomcat啟動,控制台隻輸出org.apache.catalina.startup.catalina.start server startup in xxxms,就沒有後續了,通路服務的接口,也是失敗,說明服務沒有啟動起來,但是就是通路不同,查了很多資料,最後解決方案如下:
報錯截圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csAzaUFWNk1mYoJ1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2YTOzADMzAjM2IjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
解決方案:
1、确認pom.xml的project節點下有标簽<packaging>war</packaging>,通常配置在artifactId及version标簽下。
外置tomcat啟動項目的pom中必須有依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
2、若建立項目時選擇的Packaging是war,将會在項目根目錄生成ServletInitializer類。
3、若項目中沒有ServletInitializer類,則建立ServletInitializer類,繼承SpringBootServletInitializer并重寫configure方法,亦可直接在SpringbootdemoApplication類上繼承SpringBootServletInitializer。建議建立ServletInitializer類,這樣目錄結構很清晰,一看目錄結構就清楚該項目是用tomcat啟動的。
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.stereotype.Component;
@Component
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringbootdemoApplication.class);
}
}
SpringbootdemoApplication.class是啟動類,在不同的項目,這裡需要改下。
至于SpringBootServletInitializer的作用,可以參考這篇文章:
https://blog.csdn.net/qq_28289405/article/details/81279742