「Spring Boot 新特性」 jar 大小自动瘦身

JAVA架构日记

共 1512字,需浏览 4分钟

 ·

2020-11-20 01:02

自动分析瘦身

Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar。当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离可以参考 slot-maven-plugin[1], 但此种方法治标不治本并不能减少原有依赖的 JAR 的大小。

Spring Boot 2.4 提供对构建输出 JAR 分析自动瘦身的功能,自动在构建输出可运行 JAR 时删除 empty starter dependencies

效果展示

先来分别基于 Spring Boot 2.4.0 和 Spring Boot 2.3.6 来构建一个可运行的 jar ,再来聊什么是 empty starter

  • 使用 start.spring.io[2] 创建一个空的 Spring Boot 项目,注意不需要引入任何依赖
  • mvn clean install 构建出来相关可运行 jar
  • 分别解压两个 jar 到两个不同的目录
tar -zxvf demo-2.3.6.jar -C demo-2.3.6/

tar -zxvf demo-2.4.0.jar -C demo-2.4.0/
  • 统计依赖 jar 个数, 2.3.6 共计 19 个 依赖 jar 而 2.4.0 只有 18 个依赖 jar ,缺少了 spring-boot-starter.jar
cd demo-2.3.6/BOOT-INF/lib && ll -h | wc -l
19

cd demo-2.4.0/BOOT-INF/lib && ll -h | wc -l
18

什么是 empty starter

如上文所述,我们在基于 start.spring.io 创建项目的时候 已经默认引入了, 但在 Spring Boot 2.4 中会自动删除此类 empty starter dependencies jar

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starterartifactId>
    dependency>

我们来看一下 spring-boot-stater 有什么特殊性?

  • ① 空 jar 不包含任何代码
  • ② 有引用其他 jar,只为批量导入其他 jar

所以此类型 jar 在构建成可运行 jar 时并未实际意义,因为批量导入的依赖 jar 都可以被引入。目前 spring boot 提供的 redisamqp等大部分 starter 均是此类 jar,所以在构建后会自动删除。

自定义 jar 实现自动瘦身

  • 创建 MANIFEST.MF jar 包元信息,添加一行 Spring-Boot-Jar-Type: dependencies-starter 即可
resources
     ├── META-INF
         └── MANIFEST.MF

参考资料

[1]

slot-maven-plugin: https://github.com/core-lib/slot-maven-plugin

[2]

start.spring.io: https://start.spring.io

Spring Boot 2.4.0 正式发布,全面拥抱云原生
Spring Boot 2.4 全新Cron表达式处理机制
「Spring Boot 新特性」一键构建Docker镜像

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报