当前位置: 首页 > news >正文

springboot分层打包,减少重复构建和传输的开销

在 Spring Boot 中,分层打包(Layered Packaging) 是一种优化策略,特别针对 容器化部署(如 Docker) 的场景设计。它的核心思想是将应用的不同部分(依赖、资源、代码等)划分为独立的层(Layer),利用容器镜像的分层缓存机制,减少重复构建和传输的开销。


分层打包的作用

  1. 提升 Docker 镜像构建效率

    • 如果应用代码变动但依赖未变,Docker 只需重新构建代码层,而依赖层可以直接复用缓存。
    • 减少镜像体积和构建时间,尤其适用于 CI/CD 流水线。
  2. 优化镜像层结构

    • 将频繁变动的层(如应用代码)放在上层,稳定层(如依赖)放在下层,充分利用 Docker 的层缓存机制。
  3. 减少重复传输

    • 在 Kubernetes 等集群中,节点间拉取镜像时,未变化的层可直接复用本地缓存。

分层结构

Spring Boot 默认将应用分为以下 4 个层:

层名内容变动频率
dependencies第三方依赖(如 spring-core, logback
spring-boot-loaderSpring Boot 的类加载器(JarLauncher 等)
snapshot-dependencies快照版本的依赖(如 1.0.0-SNAPSHOT
application应用代码、配置文件(src/main/**

如何启用分层打包?

1. Maven 配置

pom.xml 中启用分层:

org.springframework.boot spring-boot-maven-plugin true
2. Gradle 配置

build.gradle 中启用分层:

bootJar {
layered {
enabled = true
}
}


分层结果

打包后生成的 JAR 文件中会包含一个 layers.idx 文件,定义各层的内容:

  • “dependencies”:
    • “BOOT-INF/lib/spring-core-6.1.0.jar”
    • “BOOT-INF/lib/logback-classic-1.4.14.jar”
  • “spring-boot-loader”:
    • “org/”
  • “snapshot-dependencies”:
    • “BOOT-INF/lib/my-snapshot-lib-1.0.0-SNAPSHOT.jar”
  • “application”:
    • “BOOT-INF/classes/”
    • “BOOT-INF/config/”

与 Docker 结合使用

通过分层打包,可以编写高效的 Dockerfile

使用分层构建

FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
RUN java -Djarmode=layertools -jar app.jar extract

正式镜像

FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT [“java”, “org.springframework.boot.loader.JarLauncher”]


命令 RUN java -Djarmode=layertools -jar app.jar extract 是 Spring Boot 分层打包(Layered Packaging)中与 Docker 镜像构建 结合使用的关键步骤,其核心作用是将 Spring Boot 的可执行 JAR 文件按预定义的分层结构解压到指定目录。以下是详细解释:


命令分解

部分说明
java -jar app.jar运行 Spring Boot 生成的 Fat JAR 文件(包含所有依赖和代码)。
-Djarmode=layertools设置 JVM 参数,启用 Spring Boot 的 layertools 模式。
extractlayertools 模式下执行的命令,表示将 JAR 中的分层内容解压到文件系统。
关键步骤
  1. 使用 layertools 工具解压分层后的内容。
  2. 按层顺序复制到镜像中,依赖层(稳定)先复制,应用层(易变)最后。

自定义分层

如果需要调整默认分层逻辑,可以通过 layers.xml(Maven)或自定义 Layers 接口(Gradle)实现。例如:

<!-- src/main/layers.xml -->
<layers xmlns="http://www.springframework.org/schema/boot/layers"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/boot/layers https://www.springframework.org/schema/boot/layers/layers-3.2.xsd"><application><into layer="application"><include>com/example/**</include></into></application><dependencies><into layer="snapshot-dependencies"><include>*:*:*SNAPSHOT</include></into><into layer="dependencies"/></dependencies>
</layers>

适用场景

  • 高频部署的微服务:代码频繁更新,但依赖稳定。
  • 大型依赖项:如数据库驱动、SDK 等体积大的依赖。
  • 多环境构建:开发、测试、生产环境共用基础依赖层。

分层打包通过解耦应用的不同部分,优化了容器化部署的效率。它解决了传统 Fat JAR 在 Docker 中重复构建的问题,是 Spring Boot 对云原生场景的重要支持。

相关文章:

  • 【重走C++学习之路】25、特殊类设计
  • ActiveMQ 性能优化与网络配置实战(一)
  • qemu学习笔记:QOM
  • 算法--模拟题目
  • C++中常用的十大排序方法之1——冒泡排序
  • 【数据结构】线性表--顺序表
  • 常用机械传动方式对比
  • 【笔记】深度学习模型训练的 GPU 内存优化之旅④:内存交换与重计算的联合优化篇
  • 腾讯云BI VS quickbi 企业选型(从企业实际功能使用和费用对比)
  • 提升采购管理,打造核心竞争力七步战略采购法详解P94(94页PPT)(文末有下载方式)
  • 【Bootstrap V4系列】学习入门教程之 页面内容排版
  • Qwen3 发布:优化编码与代理能力,强化 MCP 支持引领 AI 新潮流
  • PHP之CURL通过header传参数及接收
  • 如何快速定位网络中哪台主机发起ARP攻击
  • 前端八股 6
  • 【Linux】C语言补充知识
  • 西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
  • PHP-Cookie
  • 攻防世界 - Misc - Level 6 | Wireshark
  • 字节一面:后端开发
  • 高速变道致连环车祸,白车“骑”隔离栏压住另一车,交警回应
  • 辽宁辽阳火灾事故饭店经营者已被控制,善后处置全面展开
  • 习近平对辽宁辽阳市白塔区一饭店火灾事故作出重要指示
  • 银川市长信箱被指乱回复:问诗词大会、答工程欠款,官方称工作失误
  • 王羲之《丧乱帖》在日本流传了1300年,将在大阪展23天
  • 传媒湃︱《金陵晚报》副刊“雨花石”5月起改为免费刊登