多环境部署方案(开发、测试、生产,搭配Tomcat\+WAR包)

多环境部署方案(开发、测试、生产,搭配 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

⚠️ 缺点(重点):

  1. 类库冲突风险极高,dev 和 test 包里面如果 jar 版本不一致,直接报错

  2. 共用 JVM 内存,某个环境内存溢出,整个 Tomcat 全部挂掉

适合:演示、轻量测试,正式生产不要这么干


代码层面:如何区分环境(重点!)

WAR 项目常见两种方式管理环境配置

方式 A:多个 properties 配置文件(SSM 传统 web 项目)

resources 下放多套配置

Plain 复制代码
resources/
├─ application-dev.properties   #开发
├─ application-test.properties  #测试
└─ application-prod.properties  #生产

启动时指定激活哪个环境,3 种指定方式

  1. web.xml 配置
xml 复制代码
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>
  1. Tomcat JVM 参数(推荐,打包不用改代码!)
    修改bin/catalina.bat,添加 JVM 参数
bat 复制代码
set JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active=test

好处:同一个 war 包,放到不同 Tomcat,改这个参数切换环境,不用重新打包!

  1. 启动命令传入参数
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
相关推荐
白远山1 小时前
无人自助健身平台搭建:从架构设计到设备联动的完整实战
java·开发语言·架构·需求分析
古法安卓1 小时前
Android-Fork 机制详解
android·java·android studio
曹牧1 小时前
Spring:HttpMessageConverter
java
许彰午1 小时前
47-MetaGrid元数据表格
java·低代码·架构
wang_shu_mo_ran1 小时前
Spring MVC的常用注解和用法(一)
java·spring·mvc
晴空蓝天2 小时前
Spring Boot 3.5 脚手架里的 JWT + Redis 双轨会话,双端 token 隔离我是这么设计的
java·spring boot·redis
IT枫斗者枫哥2 小时前
MyBatis 列表查询优化:一页20条数据,21次SQL改成2次
java
君顾12 小时前
本地电竞服务交易系统架构设计与实战:从同城服务撮合到订单履约
java·开发语言·电竞
小刘在重生~2 小时前
十六(3)、《集合扩充》CopyOnWriteArrayList 超详细解析(线程安全集合)
java·笔记·面试·职场和发展