Spring Boot分层打包最佳实践

B站影视 内地电影 2025-06-03 17:22 1

摘要:是的,Spring Boot 默认会打包成一个可执行的 "fat jar"(包含所有依赖的单一JAR)。但自Spring Boot 2.3.0起,官方支持了分层打包(Layered JAR),这是一种更高效的打包方式,特别适合容器化部署。以下是详细实现:

是的,Spring Boot 默认会打包成一个可执行的 "fat jar"(包含所有依赖的单一JAR)。但自 Spring Boot 2.3.0 起,官方支持了 分层打包(Layered JAR),这是一种更高效的打包方式,特别适合容器化部署。以下是详细实现:

一、分层打包的优势

构建速度更快:依赖库不变时无需重复打包镜像层复用:Docker 镜像层可缓存依赖,减少推送/拉取体积安全更新:仅需替换应用层,无需重建整个镜像

二、实现步骤(Maven 示例)

1. 启用分层打包(pom.xml)

org.springframework.boot

spring-boot-maven-plugin

true

2. 打包项目

bash

mvn clean package

生成的文件:

target/

├── your-app.jar # 可执行JAR

├── your-app.jar.original # 原始薄JAR

└── layers/ # 自动生成的分层目录

├── dependencies

├── spring-boot-loader

├── snapshot-dependencies

└── application

三、分层结构解析

默认分为四层(按加载顺序):

层名内容变更频率dependencies第三方依赖库(如Spring框架)低spring-boot-loaderSpring Boot 类加载器极低snapshot-dependenciesSNAPSHOT 版本的依赖中等application应用代码/配置文件/资源文件高

四、自定义分层策略

src/main/resources 下创建 layers.idx 文件:

txt

- "dependencies":

- "com/lib/*.jar"

- "org/apache/*.jar"

- "internal-dependencies":

- "com/company/internal/*.jar"

- "application":

- "com/company/app/**"

- "application.yml"

或在 pom.xml 中指定自定义文件:

true

${project.basedir}/src/main/resources/layers.idx

五、Dockerfile 优化示例

利用分层提升构建效率:

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"]

六、验证分层效果

解压生成的JAR查看结构:

bash

jar tf target/your-app.jar | grep -E "BOOT-INF/layer"

输出示例:

BOOT-INF/layers/dependencies/...

BOOT-INF/layers/application/...

七、Gradle 配置(build.gradle)

groovy

bootJar {

layered {

enabled = true

// 可选:自定义层

application {

intoLayer("static-resources") {

include "static/**"

}

}

}

}

总结建议

场景推荐打包方式传统单机部署默认 fat JARKubernetes/Docker分层 JAR频繁迭代的应用分层 + 镜像缓存优化

分层打包通过解耦依赖和应用代码,显著提升了云原生场景下的部署效率。建议所有基于容器的Spring Boot项目使用此方案。

来源:老客数据一点号

相关推荐