部署多个Spring Boot项目时,Tomcat端口冲突怎么解决?

在部署多个 Spring Boot 项目时,如果它们默认都使用 8080 端口(Tomcat 默认端口),就会发生端口冲突。解决该问题有以下几种常用方法:


✅ 方法一:通过 application.propertiesapplication.yml 指定不同端口(推荐)

方式 A:每个项目单独配置

在项目根目录的 src/main/resources/application.properties 中添加:

server.port=8081

或在 application.yml 中:

server:
  port: 8082

✅ 优点:简单、清晰、可版本控制;适合开发/测试环境。
⚠️ 注意:需为每个项目设置唯一端口


方式 B:通过启动参数动态指定(灵活,适合容器化或脚本部署)

java -jar app.jar --server.port=8083
# 或
java -Dserver.port=8084 -jar app.jar

适用于:

  • CI/CD 流水线
  • Docker 编排(配合环境变量)
  • 多实例快速启停

✅ 方法二:使用 @Profile + 多配置文件(进阶)

创建不同环境的配置文件:

src/main/resources/
├── application.yml          # 默认配置
├── application-dev.yml      # dev 环境:port=8081
└── application-prod.yml     # prod 环境:port=8082

启动时指定 profile:

java -jar app.jar --spring.profiles.active=dev

适合需要按环境自动切换端口的场景。


✅ 方法三:Spring Boot Actuator + 健康检查(生产级建议)

即使端口不同,也建议启用 Actuator 来监控服务状态:

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health,info
  endpoint:
    health:
      show-details: always

配合 Nginx 反向X_X或负载均衡器(如 Kubernetes Ingress),可实现统一入口 + 后端多端口路由。


🚫 不推荐的做法

  • 修改 pom.xml 中的 Tomcat 依赖 scope(无法真正避免冲突)
  • 手动修改 EmbeddedServletContainerFactory Bean(过度设计,易出错)
  • 强制绑定到固定 IP+ 端口组合(除非网络隔离要求严格)

🔧 额外建议:自动化检测端口占用

部署前可加脚本检查端口是否可用:

#!/bin/bash
PORT=$1
if lsof -i :$PORT > /dev/null; then
  echo "Port $PORT is already in use!"
  exit 1
fi
echo "Port $PORT is free."

需要我帮你生成一个完整的示例项目结构(含多端口配置 + 启动脚本)吗?