多阶段构建是优化Spring Boot项目构建速度最有效、落地最直接的手段,核心在于分离构建环境与运行环境、最大化利用Docker层缓存;通过builder阶段下载依赖并打包、runtime阶段仅复制jar包启动,配合pom.xml优先COPY、.dockerignore排除无关文件及Maven并行构建等措施,可将构建时间从分钟级压缩至秒级。

多阶段构建是优化 Spring Boot 项目构建速度最有效、落地最直接的手段之一,核心在于**分离构建环境与运行环境,最大化利用 Docker 层缓存**。它不改变业务代码,却能将镜像构建时间从分钟级压缩到秒级,尤其在 CI/CD 流水线中效果显著。
分阶段解耦:让每一步都可缓存
传统单阶段构建(如直接用 openjdk 镜像执行 mvn package)会导致每次代码变更都重新下载全部 Maven 依赖,浪费大量网络和 CPU 时间。多阶段构建通过两个关键阶段拆分职责:
-
构建阶段(builder):使用完整 JDK + Maven 镜像(如
maven:3.8.4-openjdk-17),只做依赖解析、编译、打包; -
运行阶段(runtime):切换至轻量 JRE 镜像(如
eclipse-temurin:17-jre-jammy),仅复制生成的 jar 包并启动。
这样,只要 pom.xml 不变,构建阶段的依赖层就完全复用,后续仅重跑编译和打包步骤。
精准控制 COPY 顺序:激活 Docker 缓存机制
Docker 按指令逐层构建,一旦某层内容变化,其后所有层均失效。因此必须把“变动少”的操作放在前面:
立即学习“Java免费学习笔记(深入)”;
- 先
COPY pom.xml .,再RUN mvn dependency:go-offline -B—— 确保依赖下载层独立且稳定; - 再
COPY src ./src,最后RUN mvn package -DskipTests—— 代码修改只影响最后两层; - 配合
.dockerignore排除target/、.git/、logs/等无关文件,避免误触发缓存失效。
构建过程提速:并行与跳过非必要环节
在 builder 阶段进一步压缩短耗时:
- 启用 Maven 并行构建:
RUN mvn package -T 1C -DskipTests(-T 1C表示每核一个线程); - 跳过测试执行(
-DskipTests)适用于非测试验证阶段;若需保留单元测试但加速,可用-Dmaven.test.skip=true跳过编译测试类; - 禁用 Maven 的远程元数据检查(添加
-Dmaven-metadata-refresh=false)可减少网络等待,适合私有仓库环境。
镜像瘦身:减少传输与加载开销
更小的镜像意味着更快的拉取、分发与容器启动:
- 运行阶段务必使用
jre而非jdk镜像,体积通常缩小 40% 以上; - 避免在最终镜像中保留
target/、src/、pom.xml等源码相关文件; - 可选:用
spring-boot-maven-plugin的layout=ZIP或分层 jar(Spring Boot 2.3+)配合docker build --squash进一步精简,但多阶段已覆盖主要收益。


















