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

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

ctrl+鼠標左鍵 點擊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)默認使用Tomcat作為內嵌的servlet容器。當然我們也可以使用其他的容器,比如使用undertow作為Spring Boot的內置容器:
<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默認引入的tomcat,而手動引入了undertow。
2.2 Jar部署的優(yōu)勢
- 簡單直接: 無需安裝額外的 Tomcat 服務器。
- 開放方便: 在開發(fā)階段可以通過內置的 Tomcat 快速啟動和調試
- 跨平臺性:只需確保系統(tǒng)上有正確版本的 JDK, jar 文件在不同的環(huán)境中都可以輕松運行。
2.3 Jar 部署步驟
2.3.1 項目結構

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管理,運行packsge,打成jar包

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

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

clean清除構建結果,compile重新編譯,package重新打包
重新運行
可見,訪問本地的端口發(fā)生了變化
3.使用外置 Tomcat 打包為 War 部署
3.1 什么是外置 Tomcat 部署?
在一些企業(yè)環(huán)境中,常常需要將Spring Boot項目打包為 war 文件并部署到現(xiàn)有的 Tomcat 服務器中。這種方式比較符合傳統(tǒng)的 Java Web 項目部署方式。
3.2 War 部署的優(yōu)勢
兼容傳統(tǒng)的項目: Tomcat 作為一個 Web 服務器,支持部署多個 Web 應用。如果把每個應用都打包成 war 包,然后部署到 Tomcat 中,Tomcat 能夠很好地管理這些應用,比如對它們進行獨立的加載、啟動、停止等操作,這種方式在長期的 Web 應用開發(fā)和部署實踐中,形成了較為成熟和規(guī)范的流程。而如果采用其他不規(guī)范的部署方式,可能會出現(xiàn)應用之間相互干擾、Tomcat 管理困難等問題~
靈活配置:可以在 Tomcat 服務器層面配置資源池、連接器等,使多個項目共用
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中設置打包方式 默認為jar 需要修改為war
<packaging>war</packaging>
如果你在自己的pom.xml文件中找不到標簽,那么你可以自己添加,位置可以參考本圖的

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

總結
到此這篇關于Spring Boot通過tomcat部署項目(包含jar包、war包)的文章就介紹到這了,更多相關SpringBoot通過tomcat部署項目內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring-boot中使用spring-boot-devtools的實現(xiàn)代碼
這篇文章主要介紹了spring-boot中使用spring-boot-devtools的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
spring boot整合RabbitMQ(Direct模式)
springboot集成RabbitMQ非常簡單,如果只是簡單的使用配置非常少,springboot提供了spring-boot-starter-amqp項目對消息各種支持。下面通過本文給大家介紹下spring boot整合RabbitMQ(Direct模式),需要的朋友可以參考下2017-04-04
Java實現(xiàn)歸并排序的方法詳解(包含遞歸+非遞歸)
歸并歸分n時間復雜度O(nlogn)的歸并排序,遞歸與迭代實現(xiàn),穩(wěn)定排序適用于大數(shù)據(jù)處理,本文詳細解析了遞歸與非遞歸版本的實現(xiàn)邏輯與應用場景,需要的朋友可以參考下2026-05-05
java: 程序包com.fasterxml.jackson.annotation不存在的解決辦法
當我們在導入程序之后,系統(tǒng)給出錯誤提示:java: 程序包com.fasterxml.jackson.annotation不存在,本文主要介紹了Java程序包不存在的三種解決方法,需要的朋友可以參考下2024-02-02
SpringBoot整合MyBatis-Flex的保姆級教程
MyBatis-Flex 是一個基于 MyBatis 的增強框架,它提供了比傳統(tǒng) MyBatis Plus 更加強大和靈活的功能特性,下面我們就來看看如何在SpringBoot中整合MyBatis-Flex吧2026-01-01
Android開發(fā)中Socket通信的基本實現(xiàn)方法講解
這篇文章主要介紹了Android開發(fā)中Socket通信的基本實現(xiàn)方法講解,是安卓上移動互聯(lián)網(wǎng)程序開發(fā)的基礎,需要的朋友可以參考下2015-12-12

