多环境部署方案(开发、测试、生产,搭配 Tomcat+WAR 包)
多环境一般指:dev 开发环境、test 测试环境、prod 生产环境
核心目标:不同环境数据库地址、端口、日志、账号不一样,一套代码打包,切换环境
两种主流思路
思路 1:多套独立 Tomcat 实例(推荐传统 WAR 项目)
一台服务器部署多个 Tomcat,每个环境单独一套 Tomcat,互不干扰。
-
dev:TomcatA,端口 8081
-
test:TomcatB,端口 8082
-
prod:TomcatC,端口 8080
优点:
✅ 环境完全隔离,一个环境挂了,不影响其他环境
✅ 日志、配置文件独立
✅ 多个 war 包版本互不干扰
缺点:
❌ 占用更多内存,需要维护多个 Tomcat
操作要点:复制完整 Tomcat 文件夹,修改
conf/server.xml三处端口(避免端口冲突)
xml
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444"/>
<Engine name="Catalina" defaultHost="localhost">
<Server port="8006" shutdown="SHUTDOWN">
需要改:Server端口、Connector访问端口、redirectPort,三个都不能重复。
思路 2:同一个 Tomcat 内部部署多环境 war(不推荐生产)
同一个 Tomcat 的 webapps 下放多个环境的 war 包:
-
cloudnote-dev.war→ 访问:http://xxx:8080/cloudnote-dev -
cloudnote-test.war→ 访问:http://xxx:8080/cloudnote-test -
cloudnote-prod.war→ 访问:http://xxx:8080/cloudnote-prod
⚠️ 缺点(重点):
-
类库冲突风险极高,dev 和 test 包里面如果 jar 版本不一致,直接报错
-
共用 JVM 内存,某个环境内存溢出,整个 Tomcat 全部挂掉
适合:演示、轻量测试,正式生产不要这么干
代码层面:如何区分环境(重点!)
WAR 项目常见两种方式管理环境配置
方式 A:多个 properties 配置文件(SSM 传统 web 项目)
resources 下放多套配置
Plain
resources/
├─ application-dev.properties #开发
├─ application-test.properties #测试
└─ application-prod.properties #生产
启动时指定激活哪个环境,3 种指定方式
- web.xml 配置
xml
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
- Tomcat JVM 参数(推荐,打包不用改代码!)
修改bin/catalina.bat,添加 JVM 参数
bat
set JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active=test
好处:同一个 war 包,放到不同 Tomcat,改这个参数切换环境,不用重新打包!
- 启动命令传入参数
bash
java -Dspring.profiles.active=prod -jar xxx.jar #jar包用法,war是tomcat JAVA_OPTS
方式 B:Maven 打包时,打包选择环境(打包时就固定环境)
pom 配置 profile,打包命令指定环境,打包出来的 war 直接绑定环境
bash
#打包测试环境war
mvn clean package -Ptest
#打包生产环境war
mvn clean package -Pprod
缺点:换环境必须重新打包
开发本地多环境(IDEA)
你本地可以在 IDEA 新建多个 Tomcat Run Configuration:
-
Tomcat-dev:选 war-exploded,JVM 参数
-Dspring.profiles.active=dev -
Tomcat-test:选 war,JVM 参数
-Dspring.profiles.active=test
一键切换启动不同环境,不用改代码。
方案选型总结
| 方案 | 适用场景 | 推荐度 |
|---|---|---|
| 多 Tomcat 实例 + JVM 指定 profiles | 服务器 dev/test/prod,传统 war 项目 | ⭐⭐⭐⭐⭐推荐 |
| 同一个 Tomcat 放 dev/test 多个 war | 仅轻量演示,不建议正式使用 | ⭐不推荐生产 |
| Maven Profile 打包,每个环境单独 war | 简单项目,环境配置差异大 | ⭐⭐⭐ |
补充:多环境要隔离的内容
-
数据库 url、账号密码
-
Redis 地址
-
文件上传路径
-
日志级别(dev 输出 debug,prod 只输出 error)
-
接口域名、第三方密钥
扩展对比:如果以后用 SpringBoot Jar
SpringBoot jar 多环境逻辑一样,只是不用 Tomcat,直接启动命令指定环境:
bash
java -Dspring.profiles.active=prod -jar cloudnote.jar