Spring 项目 基于 Tomcat容器进行部署
文章目录
- 一、前置知识
- 二、本地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 是更现代化的部署方式。