SpringBoot外接Tomcat

安全劍客發表於2021-01-11
在部署我開源專案後端程式碼時,一直採用的jar包形式,一開始覺得沒什麼問題,挺方便的,這幾天後端程式碼改動比較頻繁,打成jar包後,每次更新都需要去伺服器停止舊的服務,過於繁瑣。

索性直接採用外接tomcat吧,打成war包方便一點,本文就跟大家分享下我的實現過程,歡迎各位感興趣的開發者閱讀本文。

專案配置

我用的SpringBoot版本為2.x,Tomcat版本為9.x,jdk版本為1.8,使用maven來管理專案,接下來就跟大家分享下我的實現過程。

配置包管理檔案

開啟專案根目錄的pom.xml檔案,在project標籤下宣告打包格式為war,程式碼如下所示:

<打包格式為war> 
<packaging>war</packaging>
排除內建tomcat

打包時預設會將內建的tomcat打包進去,這就造成了衝突問題,所以此處我們需要將內建的排除掉,在dependencies標籤下新增下述依賴。

<當打war包到tomcat時,自動排除內建的tomcat,避免二者產生衝突> 
<dependency> 
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <!--打包的時候可以不用包進去,別的設施會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。 
                相當於compile,但是打包階段做了exclude操作-->
  <scope>provided</scope> 
</dependency>

此處還有一個做法是在spring-boot-starter-web依賴內排除掉依賴內排除掉tomcat,這樣做他會把websocket相關的包也給排除掉,你專案內的websocket就沒法使用了,需要手動多引入javax.websocket-api這個依賴,這個依賴的最後更新時間是2016年,所以不推薦使用這個方法。

websocket相關

既然使用了外接tomcat,那麼原先使用內建tomcat所配置的東西就可以刪除了(當然,你不刪也是可以的,但是為了程式碼規範最好還是刪掉吧),我這裡刪除的東西如下:

pom.xml中的依賴

<!--新增websocket支援-->
<dependency> 
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

websocket的啟動配置,程式碼如下

package com.lk.config; 
 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.socket.server.standard.ServerEndpointExporter; 
 
/** 
 * websocket啟動配置 
 */ 
@Configuration 
public class WebSocketConfig { 
    @Bean 
    public ServerEndpointExporter serverEndpointExporter() { 
        return new ServerEndpointExporter(); 
    } 
}
設定打包名與路徑

如果不設定名字和路徑預設的打包名會附帶帶版本號,打包路徑在當前專案的的target目錄下,我們可以透過在pom.xml中的build標籤下對其進行自定義,程式碼如下:

<打包的目錄> 
<directory></directory>
<打包時的檔名> 
<finalName></finalName>
修改啟動類

接下來,我們修改下SpringBoot的啟動類,讓其繼承SpringBootServletInitializer,重寫configure方法,告訴它我們使用的是外接Tomcat,程式碼如下:

@SpringBootApplication 
public class ChatSystemServerApplication extends SpringBootServletInitializer { 
 // 外接tomcat需要繼承SpringBootServletInitializer,重寫SpringApplicationBuilder 
 @Override 
 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
  return application.sources(ChatSystemServerApplication.class); 
 } 
 public static void main(String[] args) { 
  SpringApplication.run(ChatSystemServerApplication.class, args); 
 } 
}

至此,我們的專案配置部分就完成了,我們重新整理下pom.xml檔案,在idea的maven工具欄點clean,然後點package,就可以打一個war包在target目錄下了。

tomcat配置

我的專案啟用了https,使用外接tomcat後,在application.yml中配置的https就失效了,我們需要在tomcat中重新配一下。

開啟https訪問

我們開啟tomcat的conf目錄下的server.xml,找到name為Catalina的Service標籤裡的標籤,修改port和redirectPort屬性,程式碼如下:

隨後,在上述標籤的後面加上下述程式碼,讓非80埠的訪問跳轉到443埠

配置SSL證照

把域名的證照檔案server.jks和keystorePass.txt檔案放在conf目錄下,在server.xml中的name為Catalina的Service標籤裡新增下述程式碼。

<!--配置SSL證照-->
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
           maxThreads="150" SSLEnabled="true">
     <SSLHostConfig> 
          <Certificate certificateKeystoreFile="conf/server.jks" 
                     certificateKeystorePassword="" 
                     type="RSA"/> 
     </SSLHostConfig> 
</Connector>

certificateKeystoreFile為你的證照檔案,certificateKeystorePassword為你的證照檔案密碼,這個密碼在keystorePass.txt檔案裡

配置路徑訪問

將war包放入tomcat的webapps目錄下後,我們想反問需要帶上專案名才可以,如果我們不想加專案名就能直接訪問我們的專案,就需要另作配置了。

在server.xml檔案中,找到標籤,在其中新增Context標籤,程式碼如下:

<配置路徑訪問> 
<Context path="" docBase=""></Context>

path: 留空則表示為域名根目錄,docBase為你的war包所在目錄

設定預設首頁

由於我們修改了tomcat的預設訪問頁面,所有的根目錄訪問時不會走ROOT目錄下的頁面,此時就需要在專案裡配置一個根目錄的對映,讓其跳轉到我們指定的專案內的ststic中的頁面,程式碼如下:

// 預設首頁對映 
@Controller 
public class DefaultController { 
    @RequestMapping("/") 
    public String Welcome(){ 
        return "forward:index.html"; 
    } 
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2748885/,如需轉載,請註明出處,否則將追究法律責任。

相關文章