文章目錄
- 一、前置知識
- 二、本地Idea運行Spring項目
- 1. 將寫好的 Spring 項目先打包成 war 包
- 2. 查看項目工件(Artifact)是否存在
- 3. 配置 Tomcat
- 3.1 添加一個本地 Tomcat 容器
- 3.2 將項目部署到 Tomcat
- 4. 運行項目
- 三、基于 Tomcat 部署及多實例部署
- 1. Spring 項目 WAR 包的部署方式
- 1.1 直接放到 Tomcat 的 `webapps` 目錄
- 1.2 通過 Tomcat Manager 部署
- 1.3 自定義部署路徑(不放在 `webapps` 下)
- 2. 部署多個相同版本的 Tomcat
- 2.1 復制多份 Tomcat 實現獨立部署
- 2.2 使用多實例配置(共享 Tomcat 核心文件)
- 2.3 使用 Docker 部署多個 Tomcat
盡管市場上許多新項目都已經轉向 Spring Boot,但對于一些老舊的 Spring 項目,尤其是維護期較長、涉及多個業務的系統,依然需要開發者掌握如何將這些項目正確地部署到 Tomcat 容器中。因此,撰寫這篇文章的目的就是為了幫助開發者和運維人員能夠在面對老的 Spring 項目時,快速而準確地完成部署任務。
一、前置知識
在傳統的 Java Web 項目中,靜態資源(如 HTML/CSS/JS/圖片等)通常存放在項目的 webapp
目錄下。Tomcat 作為常用的 Servlet 容器,會將 webapp
目錄作為默認的 Web 應用根目錄,并會直接暴露其中的靜態文件。
-
默認行為:
如果在webapp
目錄中存放了資源(例如webapp/images/logo.png
),則可以通過以下 URL 直接訪問:http://localhost:8080/images/logo.png
二、本地Idea運行Spring項目
1. 將寫好的 Spring 項目先打包成 war 包
首先,使用 IDE 或者命令行工具將 Spring 項目打包為 WAR 文件。這個過程將創建一個包含所有 Web 應用內容(包括靜態資源、配置文件等)的歸檔包。
打包完成后,請確認目標路徑中確實產生了 .war
文件。
提示:如果使用 Maven,需要在
pom.xml
中將<packaging>jar</packaging>
改為<packaging>war</packaging>
。
2. 查看項目工件(Artifact)是否存在
在某些 IDE(例如 IntelliJ IDEA)中,項目打包后的產物(.war
或 .jar
)會被稱為 Artifact。因此,在部署到 Tomcat 前,需要先檢查該 Artifact 是否已經正常生成。
如果工件(Artifact)不存在,需要手動創建。常見步驟:
- 打開 IntelliJ IDEA 的
Project Structure
→Artifacts
。 - 點擊左上角的 “+” 號,選擇 “Web Application: Archive (或 exploded)”。
- 將你項目的
webapp
目錄或輸出配置到對應的 Artifact 中。
下面是一個在 IntelliJ IDEA 中創建 webapp 對應源模塊作為工件的操作演示:
小提示:創建好以后,名稱可以改成與你想要的 Context Path 相匹配的名稱,這樣前端或其他調用者就可以使用對應路徑訪問。
3. 配置 Tomcat
當 Artifact 準備完畢后,就可以將此 Artifact 部署到 Tomcat 容器中進行運行或調試。
3.1 添加一個本地 Tomcat 容器
在 IntelliJ IDEA 中,打開 Run
→ Edit Configurations
→ 點擊 “+” 號,選擇 Tomcat Server
→ Local
:
在彈出的配置窗口中:
- 指定 Tomcat 安裝目錄
你需要事先下載并解壓 Tomcat(可從 Tomcat 官網 獲取),然后將解壓路徑填入Tomcat Home
。 - 選擇合適的 JDK
Tomcat 9 及以上版本通常兼容 JDK 8 或 11,具體根據你項目中使用的 Java 版本來決定。
3.2 將項目部署到 Tomcat
在配置好的 Tomcat Server 設置中,切換到 “Deployment” 選項卡:
點擊 “+” → Artifact
,選擇你在步驟 2 中創建或已有的 .war
文件(或 exploded 形式):
- Context Path:
在彈出的對話框里,你可以手動設置訪問路徑,例如/myapp
或/demo
。
若設置為/
,則相當于部署到根路徑,下次訪問就不需要帶上項目名。
注意:如果你改變了 Artifact 的名稱,最終在 Tomcat 中也可以將 Context Path 手動設置為你想要的值。這兩者相輔相成,但在實際生產環境中,需要根據前端或接口約定來決定合適的 Context Path。
配置完成后,你可以在 “Deployment” 頁面上看到該 Artifact 已經被添加到 Tomcat。
訪問的 URL 地址示例:
如果 Tomcat 默認端口為 8080
,并且 Context Path 設置為 /intelligenceCommand
,那么訪問路徑往往形如:
http://localhost:8080/intelligenceCommand/
4. 運行項目
最后,點擊 IntelliJ IDEA 上方的綠色運行按鈕(或 Debug
按鈕),啟動本地 Tomcat。若控制臺沒有報錯,說明部署成功,項目就能通過瀏覽器訪問。
-
控制臺輸出:
如果看到如下信息,表示服務器已正常啟動:
-
訪問測試:
在瀏覽器中輸入http://localhost:8080/myapp
(若 Context Path 是myapp
),就能看到你的應用首頁或者相關接口數據,說明部署成功。
常見問題:
- 端口占用問題:如果
8080
端口被占用,你需要在 Tomcat 中修改端口或者關閉占用8080
的應用。- 資源無法訪問 404:檢查靜態資源是否正確放在
webapp
目錄下,并且確認在.war
包中已經包含這些文件。
三、基于 Tomcat 部署及多實例部署
1. Spring 項目 WAR 包的部署方式
1.1 直接放到 Tomcat 的 webapps
目錄
-
打包成 WAR 包:
-
使用 Maven 或 Gradle 將項目打包為
.war
文件。 -
Maven 示例命令:
mvn clean package
-
打包完成后,WAR 包通常在
target
目錄下,例如:myapp.war
。
-
-
將 WAR 包放入 Tomcat 的
webapps
目錄:-
將
myapp.war
放入:<TOMCAT_HOME>/webapps/
-
-
啟動 Tomcat 并自動解壓:
-
啟動 Tomcat 后,Tomcat 會自動解壓
myapp.war
并在webapps
下生成同名目錄。 -
部署完成后,可以通過瀏覽器訪問:
http://<服務器地址>:<端口號>/myapp/
-
1.2 通過 Tomcat Manager 部署
-
啟用 Tomcat 的 Manager 應用:
-
編輯
<TOMCAT_HOME>/conf/tomcat-users.xml
文件,添加以下內容:<role rolename="manager-gui"/> <user username="admin" password="admin" roles="manager-gui"/>
-
重啟 Tomcat。
-
-
訪問 Tomcat Manager:
-
打開瀏覽器,訪問:
http://<服務器地址>:<端口號>/manager/html
-
輸入用戶名和密碼登錄。
-
-
上傳 WAR 包部署:
- 在 WAR file to deploy 部分,選擇你的
.war
文件并點擊 Deploy。
- 在 WAR file to deploy 部分,選擇你的
1.3 自定義部署路徑(不放在 webapps
下)
-
創建部署描述文件:
- 在
<TOMCAT_HOME>/conf/Catalina/localhost
下創建myapp.xml
文件。
- 在
-
指定 WAR 包位置:
<Context docBase="/path/to/myapp.war" reloadable="true" />
-
啟動 Tomcat:
-
部署完成后,可以通過瀏覽器訪問:
http://<服務器地址>:<端口號>/myapp/
-
2. 部署多個相同版本的 Tomcat
2.1 復制多份 Tomcat 實現獨立部署
-
復制多個 Tomcat 目錄:
-
假設原始目錄為
D:\tomcat-8.5.91
。 -
復制并重命名為:
D:\tomcat-instance1 D:\tomcat-instance2
-
-
修改每個實例的端口配置:
-
打開
conf/server.xml
,修改以下端口以避免沖突:-
HTTP 端口(必須配置):
- HTTP 端口是接收瀏覽器或客戶端通過 HTTP 協議訪問的主要入口。
- 默認是
8080
,如果部署多個 Tomcat 實例,需要為每個實例分配不同的 HTTP 端口(如8081
、8082
)。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
AJP 端口(可選,通常不需要):
- AJP 是一種用于代理服務器(如 Apache HTTP Server、Nginx)與 Tomcat 之間的通信協議。
- 如果你沒有使用 Apache 或 Nginx 等代理工具來轉發請求,則 AJP 不會被用到。
- 默認是
8009
,如果不需要,可以直接注釋掉相關配置。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-
Shutdown 端口(必須配置):
- Shutdown 端口用于通過命令關閉 Tomcat 實例。
- 默認是
8005
,在多個實例中需要確保每個 Shutdown 端口唯一,否則可能會導致關閉其他實例的問題。
<Server port="8005" shutdown="SHUTDOWN">
改為
8006
、8007
等。
-
-
-
啟動各個實例:
-
分別進入
instance1
和instance2
的 bin 目錄,運行:startup.bat
-
2.2 使用多實例配置(共享 Tomcat 核心文件)
如果需要節省磁盤空間,可以通過共享核心文件實現。
-
準備原始 Tomcat 核心目錄:
- 假設核心目錄為
D:\tomcat-base
。
- 假設核心目錄為
-
創建多個實例目錄:
-
創建實例目錄,例如:
D:\tomcat-instance1 D:\tomcat-instance2
每個目錄需包含以下子目錄:
conf logs temp webapps work
-
-
配置
CATALINA_BASE
和CATALINA_HOME
:-
修改每個實例的
startup.bat
腳本,添加以下內容:set CATALINA_HOME=D:\tomcat-base set CATALINA_BASE=D:\tomcat-instance1
-
對 instance2,設置:
set CATALINA_HOME=D:\tomcat-base set CATALINA_BASE=D:\tomcat-instance2
-
-
啟動實例:
-
分別進入每個實例的
bin
目錄,運行:startup.bat
-
2.3 使用 Docker 部署多個 Tomcat
-
拉取 Tomcat 鏡像:
docker pull tomcat:8.5
-
運行多個容器:
-
第一個實例:
docker run -d --name tomcat-instance1 -p 8080:8080 tomcat:8.5
-
第二個實例:
docker run -d --name tomcat-instance2 -p 8081:8080 tomcat:8.5
-
-
訪問容器:
- 實例1:http://localhost:8080
- 實例2:http://localhost:8081
注意事項
- 端口沖突:
- 確保每個實例的 HTTP、AJP 和 Shutdown 端口不同。
- 資源分配:
- 在同一服務器上運行多個實例時,合理分配 JVM 內存。
- 日志文件獨立:
- 確保每個實例的日志文件路徑獨立,避免混淆。
- 負載均衡(可選):
- 使用 Nginx 或 Apache 將請求分發到多個實例,提高可用性。
總結
- 單個 Tomcat 部署: 推薦直接將 WAR 包放入
webapps
,由 Tomcat 自動解壓和部署。 - 多個 Tomcat 部署: 可通過復制多份目錄或共享核心文件實現,Docker 是更現代化的部署方式。