Qicz’s Thoughts HUB

The creative and technical writing. Do more, challenge more, know more, be more.

SpringBoot FatJar vs ThinJar&SpringBoot Thin Planing

什么是FatJar和ThinJar?

FatJar

FatJar又叫做UberJar,就是一种超级Jar,其实就是把一个基础Jar及其依赖都打包到一个Jar里面,然后用了它就可以独立工作的Jar。总数很“重”。

ThinJar

ThinJar就是对超级Jar相对应的Jar,“纤瘦”的Jar。只有自身的资源组合(.class,properties等等)。

从二者的“身段”来看,和字面来看,FatJar就是一种肥Jar,ThinJar就是一种瘦Jar。在SpringBoot中二者的对比就会更加的明显。因为一个通常的SpringBoot应用(Jar)万万都在几MB,而ThinJar的Jar可能就在几KB,大点也就是几十KB的样子。

如果有一种方式可以让SpringBoot瘦身,你要不要?

我们先看看为什么要瘦身?

因为ThinJar很小,易于部署到服务器(可能是因为我网速慢@.@)。想想如果在一台服务器上部署多个服务的话(也会你不会这样用,但是不一定就不会存在),相同的很多依赖包在网速贼慢的情况下,还得慢慢悠悠的传。

下面就该看看如何瘦身了。从一本书开始说起,书叫《SpringBoot 2 Recipes》。在书中看了一个thinjar的章节(11-3 Reduce Archive Size Through the Thin Launcher

Problem)。

Spring Boot, by default, generates a so-called fat JAR, a JAR with all the dependencies inside it. This has some obvious benefits, as the JAR is fully self-contained. However, the JAR size can grow considerably, and when using multiple applications you might want to reuse already downloaded dependencies to reduce the overall footprint.

然后就看到了这个项目Spring Boot Thin Launcher

然后整合到了Learning SpringBoot2 LTS项目中。先用的thin-layout-1.0.22.RELEASE一直出错,找不到ThinJarLauncher,后来改为thin-layout-1.0.23.RELEASE之后,就ok了(这个问题耽误了我一天的太多的时间了,不过不尝试怎么知道问题呢!)。FatJar从尽30MB,变成了20KB不到。启动方式一样:

1java -jar xx.jar

SpringBoot Thin Launcher原理

我查看了ThinJarLauncher的源码,就是解析生成的ThinJar中的pom.xml,来下载或者直接引用本地的~/.m2/repository中的libs。

具体怎么使用,参考项目Learning SpringBoot2 LTS,参考:https://beldon.me/posts/2019/05/22/spring-boot-thin-jar.html

在这种版本https://github.com/LearnedHub/learning-springboot2-LTS/tree/31408f802570371a3c16010bdeb6f537adb365a1中使用另外的一种方式,也可以让让Jar小些,但不如thin-launcher效果好。不过在特定情景下(比如web项目的静态资源不需要打包到Jar中时),还是可以用的。参考:https://blog.csdn.net/ssrc0604hx/article/details/54175027。在这个参考中,作者使用了excludeGroupIds来去除需要独立出来的libs,其实使用include,仅包括少数需要(比如子module)的即可。比如在Learning SpringBoot2 LTS中我的做法是:

1<!-- just include self -->
2<include>
3		<groupId>${groupId}</groupId>
4  	<artifactId>${artifactId}</artifactId>
5</include>