摘要:是的,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项目使用此方案。
来源:老客数据一点号