You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含独立@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文件:
    [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.target
    
    同理创建Module-B、Module-C的service文件,然后执行以下命令:
    sudo 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:15:43