Spring?Boot通過tomcat部署項目(包含jar包、war包)的完整過程
在Spring Boot項目中,有兩種常見的部署方式:
1.使用Spring Boot自帶的 內(nèi)置 Tomcat , 將項目打包為 jar 并直接運(yùn)行
2.使用 外置 Tomcat,將項目打包為 war 并部署到傳統(tǒng)的 Tomcat 服務(wù)器中
本文將從這兩種方式的基礎(chǔ)配置到實際部署,逐步展示 Spring Boot 項目如何通過內(nèi)置和外置Tomcat實現(xiàn)部署~
1、Tomcat簡介
Tomcat 是一個非常流行的 輕量級Web服務(wù)器,他用來運(yùn)行 Java語言編寫的 Web 應(yīng)用程序。Tomcat 就像是一個"中間人"或者"服務(wù)員",負(fù)責(zé)接收用戶的請求,然后把這些請求轉(zhuǎn)給后臺的java程序,處理后再把結(jié)果返回給用戶。它與傳統(tǒng)的 Web服務(wù)器 (比如Apache HTTP Server、Nginx)不同,Tomcat主要是為動態(tài) Web應(yīng)用 服務(wù)的

1.1 起源
Tomcat的起源可以追溯到 1999 年,由 Apache 軟件基金會(一個非盈利的組織,負(fù)責(zé)很多開源項目)開發(fā)出來的。它最早是 Java Servlet 和 JavaServer Pages(JSP)的參考實現(xiàn),也是一個幫助 Java 程序處理網(wǎng)頁請求的標(biāo)準(zhǔn)工具。Tomcat之所以得名,是因為Apache 基金會的成員覺得"貓科動物" 代表著敏捷、速度和輕巧。和Tomcat的特點(diǎn)非常的契合~
1.2 作用
- 接收請求: 比如打開一個 Java Web應(yīng)用(比如說在線商店、博客網(wǎng)站),Tomcat 就負(fù)責(zé)接收你的請求,比如點(diǎn)擊商品詳細(xì)頁面。
- 調(diào)用后臺程序:Tomcat 會把這個請求交給運(yùn)行在后臺的 Java 程序,讓它處理你的請求,比如查詢商品信息。
- 返回網(wǎng)頁內(nèi)容:當(dāng)后臺程序處理好你的請求后,Tomcat 會把結(jié)果(比如商品詳細(xì)信息的頁面)返回給你的瀏覽器,讓你能看到網(wǎng)頁。
1.3 優(yōu)點(diǎn)
- 免費(fèi)開源:Tomcat 是免費(fèi)的,任何人都可以下載、使用、甚至可以改進(jìn)它的代碼。對于個人和企業(yè)來說,是非常不錯的選擇
- 輕量級:相比于其他復(fù)雜的 Java 應(yīng)用服務(wù)器(比如 WebSphere、WebLogic),Tomcat 非常輕量,不需要太多的資源,占用的內(nèi)存和 CPU 比較少。適合一些中小型的 Java Web 項目
- 跨平臺: 不管是用Windows、Mac還是Linux,Tomcat 都可以無縫運(yùn)行,這意味著可以輕松地在不同的操作系統(tǒng)上搭建 Web 服務(wù)
- 支持多種 Java 技術(shù): Tomcat 支持 Java Servlet、JSP 等Java技術(shù),這些技術(shù)都是開發(fā)Java Web應(yīng)用的基礎(chǔ)。
2、使用內(nèi)置Tomcat打包為Jar部署
2.1 什么是內(nèi)置Tomcat部署?
Spring Boot 默認(rèn)內(nèi)置了 Tomcat 服務(wù)器,在開發(fā)和生產(chǎn)環(huán)境中可以直接使用。打包時,將 Tomcat 與項目代碼一起打包成一個可執(zhí)行的jar文件,然后可以通過命令直接運(yùn)行該 jar 文件來啟動服務(wù)器。Spring Boot默認(rèn)使用Tomcat 作為內(nèi)嵌的Servlet 容器,有這些步驟可以驗證:
- 首先在自己的Spring Boot項目中的pom.xml文件中找到這一條依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

ctrl+鼠標(biāo)左鍵 點(diǎn)擊spring-boot-starter-web

我們可以看到,spring-boot-starter-web這一jar包已經(jīng)引入了如下這一條依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>3.1.3</version> <scope>compile</scope> </dependency>
根據(jù)依賴的傳遞性,可知,我們的Spring Boot項目已經(jīng)默認(rèn)使用Tomcat作為內(nèi)嵌的servlet容器。當(dāng)然我們也可以使用其他的容器,比如使用undertow作為Spring Boot的內(nèi)置容器:
<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-undertow</artifactId>
</dependency>在上面的代碼中,我們排除了spring-boot-starter-web默認(rèn)引入的tomcat,而手動引入了undertow。
2.2 Jar部署的優(yōu)勢
- 簡單直接: 無需安裝額外的 Tomcat 服務(wù)器。
- 開放方便: 在開發(fā)階段可以通過內(nèi)置的 Tomcat 快速啟動和調(diào)試
- 跨平臺性:只需確保系統(tǒng)上有正確版本的 JDK, jar 文件在不同的環(huán)境中都可以輕松運(yùn)行。
2.3 Jar 部署步驟
2.3.1 項目結(jié)構(gòu)

2.3.2 確保 pom.xml 中的依賴支持打包為 Jar
在 pom.xml 文件中,確保添加了以下插件配置,以支持打包為jar:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>2.3.3 打包
第一種方式
使用IDEA中的maven管理,運(yùn)行packsge,打成jar包

第二種方式
運(yùn)行以下命令:
mvn clean package
這兩種方式本質(zhì)上是一樣的,運(yùn)行完之后就可以得到我們想要的jar包
打包完之后我們的項目target目錄就會多出現(xiàn)兩個包,如下圖所示:

其中的.jar包是我們需要的,那么.jar.original包是什么呢?
.jar.original是普通jar包,不包含依賴
.jar是可執(zhí)行jar包,包含了pom中的所有依賴,可以直接使用java -jar命令執(zhí)行
如果是部署,我們就用.jar包
如果是給別的項目用,就要給.jar.original這個包
2.3.4 運(yùn)行Jar文件
生成的jar 文件中包含了內(nèi)置的Tomcat,進(jìn)入cmd,運(yùn)行java -jar +jar包名
注意:
- nohub 不掛斷運(yùn)行
- log.txt 輸出的日志文件,沒有則自動創(chuàng)建
nohup java -jar test.jar >log.txt &
注意:如果想要關(guān)閉項目,直接關(guān)閉這個cmd黑窗口就可以了
2.3.5 訪問接口
使用postman測試接口會發(fā)現(xiàn)接口可以行通~
在瀏覽器輸入網(wǎng)址訪問,成功
2.3.6 配置端口和其它的參數(shù)
如果需要自定義 Tomcat 的端口、編碼或其他的配置,可以在 application.properties 或 application.yml 中進(jìn)行配置:
server.port = 9090 server.servlet.context-path = /myapp
通過這樣的方式,可以直接修改應(yīng)用啟動參數(shù)和服務(wù)器配置~

clean清除構(gòu)建結(jié)果,compile重新編譯,package重新打包
重新運(yùn)行
可見,訪問本地的端口發(fā)生了變化
3.使用外置 Tomcat 打包為 War 部署
3.1 什么是外置 Tomcat 部署?
在一些企業(yè)環(huán)境中,常常需要將Spring Boot項目打包為 war 文件并部署到現(xiàn)有的 Tomcat 服務(wù)器中。這種方式比較符合傳統(tǒng)的 Java Web 項目部署方式。
3.2 War 部署的優(yōu)勢
兼容傳統(tǒng)的項目: Tomcat 作為一個 Web 服務(wù)器,支持部署多個 Web 應(yīng)用。如果把每個應(yīng)用都打包成 war 包,然后部署到 Tomcat 中,Tomcat 能夠很好地管理這些應(yīng)用,比如對它們進(jìn)行獨(dú)立的加載、啟動、停止等操作,這種方式在長期的 Web 應(yīng)用開發(fā)和部署實踐中,形成了較為成熟和規(guī)范的流程。而如果采用其他不規(guī)范的部署方式,可能會出現(xiàn)應(yīng)用之間相互干擾、Tomcat 管理困難等問題~
靈活配置:可以在 Tomcat 服務(wù)器層面配置資源池、連接器等,使多個項目共用
3.3 War 部署
3.3.1 更換入口類
入口類要繼承SpringBootServletInitializer并重寫configure方法
我們先找到Spring Boot的入口類,入口類的名字一定包含("~Application")

@SpringBootApplication
public class SpringbootstudyApplication extends SpringBootServletInitializer {
//繼承SpringBootServletInitializer 重寫 configure
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(SpringbootstudyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootstudyApplication.class, args);
}
}3.3.2 配置 pom.xml 文件
- 修改打包方式
先讓IDEA知道你這次要打包成war包,在pom.xml中設(shè)置打包方式 默認(rèn)為jar 需要修改為war
<packaging>war</packaging>
如果你在自己的pom.xml文件中找不到標(biāo)簽,那么你可以自己添加,位置可以參考本圖的

添加依賴
由于 SpringBootServletInitializer 類需要用到 servlet-api 的相關(guān)jar包,所以需要添加依賴
如果你的項目是Spring Boot2.X,你就使用下面的依賴
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version><!--版本號改成你自己適用的-->
<scope>provided</scope><!-- 使用 provided 作用域,因為外部容器會提供 Servlet API -->
</dependency>如果你的項目是Spring Boot3.X的,那就使用下面的依賴
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> <!-- 使用 provided 作用域,因為外部容器會提供 Servlet API --> </dependency>
我們需要使用provided作用域是因為:
Tomcat容器中存在Servlet,Maven 只會在編譯和測試階段將相關(guān)依賴加入到類路徑中,打包時不會將其打入到最終的包中,這樣就避免了與外部容器中已有的 Servlet API 版本沖突。
3.3.3 移除Spring Boot內(nèi)嵌的Tomcat
第一種方式(推薦):
在pom.xml文件中添加以下的依賴
<!--設(shè)置此包運(yùn)行時不可用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency><scope>provided</scope> 這個配置項非常重要,它的作用是 指定作用范圍 。provided 意味著這個依賴會在開發(fā)、編譯和測試環(huán)境中存在,但是不會被打包到最終的 war 文件中(因為外部運(yùn)行環(huán)境已經(jīng)有 Tomcat 服務(wù)器,所以在項目中不需要再嵌入)
第二種方式:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
替換為:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除內(nèi)置tomcat jar包--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
注意如果使用了這種方式,那么在開發(fā)、測試、編譯環(huán)境中我們也移除了內(nèi)置的 Tomcat 服務(wù)器,我們的Spring Boot項目就不可以在開發(fā)環(huán)境(IDEA)中運(yùn)行了
運(yùn)行時會出現(xiàn)報錯提醒~
這是因為排除內(nèi)置的 Tomcat 依賴后,Spring Boot 會認(rèn)為你不再使用嵌入式的Web 容器(比如 Tomcat、Jetty 等),而是打算將應(yīng)用部署到外部容器(如外部的 Tomcat)。這會導(dǎo)致Spring Boot 不再自動配置嵌入式的 Web 容器,因此你的應(yīng)用在 IDEA 中無法啟動,因為沒有配置 SevletWebServerFactory 這個內(nèi)置的 Servlet 容器工廠。Spring Boot 項目在 IDEA 中運(yùn)行是需要嵌入式的 Web 容器的~
這時我猜細(xì)心的同學(xué)會問了,我們在(2)中不是引入了servlet-api這個依賴嗎,這個的意思難道不是給我們的springboot項目引入容器?
當(dāng)然不是了,servlet-api 依賴是 Servlet API 的實現(xiàn),它為 Java Web 應(yīng)用程序提供了處理 HTTP 請求和響應(yīng)的核心功能。具體來說,Servlet 是 Java Web 應(yīng)用程序的基礎(chǔ)技術(shù),定義了如何接收 HTTP 請求、處理業(yè)務(wù)邏輯,并返回 HTTP 響應(yīng)??偟膩碚f,它并不提供容器,而是僅提供Java Web 應(yīng)用程序的核心 HTTP 處理能力。
推薦使用第一種移除方式,這樣你可以完全不引入servlet-api,因為內(nèi)置的tomcat服務(wù)器中已經(jīng)包含了Servlet API,所以編譯打包一點(diǎn)問題也沒有。這也是我推薦第一種移除方式的原因~
3.3.4 提醒
就是這塊地方,配置和不配置的效果都是一樣的
server.port = 9090 server.servlet.context-path = /myapp
因為yml中的server配置應(yīng)該是對內(nèi)置的tomcat 的一個配置,我們現(xiàn)在并沒有內(nèi)置 tomcat ,所以配置和不配置都是一樣的效果,都不會生效的~
- port --> 還是以 tomcat 的配置文件中的端口啟動
- context-path --> 還是以 war包的名字作為項目路徑
但是需要注意,就是一旦配置了,就需要將其配置對,不能有語法上的錯誤~
3.3.5 打包
在maven中雙擊package或者使用 mvn clean package命令
這個時候就可以看到出現(xiàn)了war包

總結(jié)
到此這篇關(guān)于Spring Boot通過tomcat部署項目(包含jar包、war包)的文章就介紹到這了,更多相關(guān)SpringBoot通過tomcat部署項目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea亂碼修改bin目錄下的idea.exe.vmoptions無效問題
這篇文章主要介紹了idea亂碼修改bin目錄下的idea.exe.vmoptions無效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
淺談Spring Cloud Eureka 自我保護(hù)機(jī)制
這篇文章主要介紹了淺談Spring Cloud Eureka 自我保護(hù)機(jī)制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
JDK-StringJoiner構(gòu)造及添加元素源碼分析
這篇文章主要為大家介紹了JDK-StringJoiner構(gòu)造及添加元素源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
PageHelper在springboot+mybatis框架中的使用步驟及原理解析
這篇文章主要介紹了PageHelper在springboot+mybatis框架中的使用步驟及原理解析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

