含独立@SpringBootApplication的多模块Spring Boot Maven项目部署及AWS部署咨询
Spring Boot多模块项目部署方案
一、能否打包为单个Jar启动所有应用?
不行。每个子模块都带有独立的@SpringBootApplication注解,属于三个完全独立的Spring Boot应用,各自拥有独立的上下文、端口和资源文件。强行打包到单个Jar会引发上下文冲突(如Bean重复定义、端口占用),且Spring Boot的可执行Jar结构不支持在一个进程内同时启动多个主应用。
如果要在单个进程内运行,需要重构架构:将三个应用合并为一个主应用下的子模块(比如用Spring Profile区分不同业务逻辑,或拆分为共享主上下文的组件),但这会改变原有项目结构,不属于简单打包的范畴。
二、常规部署方案
1. 本地/单机部署
分别启动三个生成的Jar包,注意Module-B依赖Module-A,需保证A先启动:
- 启动Module-A:
java -jar Module-A/target/module-a-xxx.jar - 等待A启动完成后,启动Module-B:
java -jar Module-B/target/module-b-xxx.jar - 启动Module-C:
java -jar Module-C/target/module-c-xxx.jar
可以编写脚本批量启动:
Linux Shell脚本示例:
#!/bin/bash java -jar Module-A/target/module-a-*.jar & sleep 10 # 等待Module-A初始化完成 java -jar Module-B/target/module-b-*.jar & java -jar Module-C/target/module-c-*.jar &
Windows Bat脚本示例:
start java -jar Module-A\target\module-a-*.jar timeout /t 10 /nobreak start java -jar Module-B\target\module-b-*.jar start java -jar Module-C\target\module-c-*.jar
2. AWS部署方案
(1)EC2实例部署
- 将三个Jar包上传到EC2实例(可通过SCP、AWS CLI或控制台上传)
- 用systemd配置为后台服务,实现开机自动启动:
以Module-A为例,创建/etc/systemd/system/module-a.service文件:
同理创建Module-B、Module-C的service文件,然后执行以下命令:[Unit] Description=Module-A Service After=network.target [Service] User=ec2-user ExecStart=/usr/bin/java -jar /home/ec2-user/module-a-xxx.jar Restart=always RestartSec=10 [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl enable module-a.service module-b.service module-c.service sudo systemctl start module-a.service sleep 10 sudo systemctl start module-b.service module-c.service- 注意配置EC2安全组,开放8080、8200、8300端口的入站规则。
(2)Elastic Beanstalk部署
为每个子模块创建独立的Elastic Beanstalk环境:
- 分别将Module-A、Module-B、Module-C的Jar包作为独立应用,上传到各自的Beanstalk环境
- 在环境配置中设置对应端口,Beanstalk会自动映射到负载均衡的80/443端口(或直接使用实例端口)
- 由于Module-B依赖Module-A,需在Module-B的环境变量中配置Module-A的访问地址(如Beanstalk分配的域名)。
(3)Docker容器化部署(推荐)
- 为每个子模块编写Dockerfile,以Module-A为例:
FROM openjdk:17-jdk-slim WORKDIR /app COPY target/module-a-xxx.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] - 构建镜像:
docker build -t module-a:v1 ./Module-A,同理构建module-b、module-c镜像 - 将镜像上传到AWS ECR(弹性容器注册表)
- 用ECS(弹性容器服务)或EKS(弹性 Kubernetes 服务)部署:
- ECS:创建三个任务定义对应三个镜像,设置端口映射后创建服务运行任务;配置服务发现,让Module-B能获取Module-A的访问地址。
- EKS:编写Deployment和Service YAML文件,分别部署三个应用,用ClusterIP服务实现内部访问,NodePort/LoadBalancer服务对外暴露。
三、核心注意事项
- Module-B依赖Module-A,部署时必须保证Module-A先完成启动,且Module-B的配置中需使用动态地址(如环境变量)而非硬编码,避免地址变更导致服务不可用。
- 生产环境建议使用配置中心(如Spring Cloud Config)统一管理端口、依赖服务地址等配置。
- 监控方面,可利用AWS CloudWatch收集EC2/ECS的日志和指标,Spring Boot应用可集成Micrometer将自定义指标发送到CloudWatch。
内容的提问来源于stack exchange,提问作者user21154706
相关产品推荐
相关产品推荐

