首頁 >Java >java教程 >SpringBoot專案打包發佈到外部tomcat遇到的問題怎麼解決

SpringBoot專案打包發佈到外部tomcat遇到的問題怎麼解決

WBOY
WBOY轉載
2023-05-10 17:49:141136瀏覽

先說遇到問題的情境:

第一次嘗試使用spring boot框架寫了個小web項目,在Intellij IDEA中能正常啟動運作。使用maven 執行install,產生war包,發佈到本機的tomcat下,出現異常,主要的異常資訊是  .......LifeCycleException。經過各種搜索,找到答案。

spring boot因為內嵌tomcat容器,所以可以透過打包為jar包的方法將專案發布,但是如何將spring boot專案打包成可發佈到tomcat中的war包專案呢?

1. 既然需要打包成war套件項目,首先需要在pom.xml檔案中修改打包類型,將spring boot預設的jar修改為war形式;

2. 其次spring boot的web專案中內嵌tomcat伺服器,所以如果我們想要發布war包到tomcat項目,要講spring boot中內嵌的tomcat包依賴排除,不然產生衝突,打開下面程式碼中的註解即可。

<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>

有一點想說的是,如果本地開發的時候依然想要使用spring boot內嵌tomcat進行調試,添加如下依賴即可;

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-tomcat</artifactid>
  <scope>provided</scope>
</dependency>

3. spring boot發布jar套件web程式的入口是main函數所在的類,使用@SpringBootApplication註解。但是如果war套件發佈至tomcat,需要增加 SpringBootServletInitializer 子類,並覆寫它的 configure 方法,或直接將main函數所在的類別繼承 SpringBootServletInitializer 子類,並覆寫它的 configure 方法。程式碼舉例如下,

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
   
  @Override
  protected SpringApplicationBuilder configure(
      SpringApplicationBuilder application) {
    return application.sources(DemoApplication.class);
  }
 
   
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

以上就完成了spring boot專案打包war包的所有步驟,可以發佈至tomcat7及其以上版本。

最後還有最重要的一點,如果你本機的tomcat版本和  springboot自動整合的8.0版本不一致。也會出問題,解決方法 :

我本地的Tomcat版本是8.0.28,而伺服器上的Tomcat是7.0.69。我在本地下了個Tomcat7.0.70部署也報同樣錯誤。更加確定問題跟Tomcat版本有關。經過多方查找資料,最後在Stackoverflow上看到一個老外說SpringBoot默認Servlet容器是基於Tomcat8的

在打好的war包中確實發現了Tomcat相關jar包,而且是Tomcat8的,拿Tomcat8的embed套件在Tomcat7下面那肯定是不能用啊 

SpringBoot專案打包發佈到外部tomcat遇到的問題怎麼解決

要支援低版Tomcat需要在maven中指定Tomat版本,設定如下:

<properties>
  <tomcat.version>7.0.69</tomcat.version>
</properties>

然後依賴中加上(這個其實不加也行, 官方文件是加上的)

<dependency>
  <groupid>org.apache.tomcat</groupid>
  <artifactid>tomcat-juli</artifactid>
  <version>${tomcat.version}</version>
</dependency>

加上以後試了下,果然是沒問題了。看了下war套件中的lib目錄,確實已經變成Tomcat7的包了 

SpringBoot專案打包發佈到外部tomcat遇到的問題怎麼解決

#但是我還是有點疑惑, 這樣配置打成包豈不是換個Tomcat版本就要重新打次包包?既然是因為SpringBoot內部的Servlet容器造成了這個限制, 那我不用行不行?又查了很多資料, 還真有辦法!


<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-tomcat</artifactid>
  <scope>provided</scope>
</dependency>

以上是SpringBoot專案打包發佈到外部tomcat遇到的問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除