小菜鸡写公众号啦,欢迎欢迎来玩呀
今天来写写 jar 包大小优化的问题。
场景描述
在快速迭代的业务流程中,每更新一次代码,可能意味着项目要重新打包一次。如果每一次更新都引入了不同的依赖包,那么最终项目打包出来的 jar 就会很大,可能上百兆。对于服务器带宽不够友好的情况下,我们会在上传 jar 包这一环节耗费很多时间。如何节约这一时间成本,是我们要考虑的一个问题。
例如
- 我们将 jar 包解压出来,分别有3个目录:
- 在 BOOT-INF 文件夹里面,包含了项目编译后的class文件以及引用的lib。我们对比一下可以发现,lib文件夹的大小其实占了整个jar包大小的99%
开始精简
由上可知,我们只需要把常用的依赖包单独抽取出来即可。
我们只需要在pom.xml文件配置一下即可。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 此处省略多余信息.....-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 关键点:指定layout = ZIP;打包的时候就不会把依赖的jar一起当进去 -->
<layout>ZIP</layout>
<!-- 如果打包时需要指定保留某些依赖,可以使用includes -->
<includes>
<!-- 例如本次打包我希望保留alya-common这个依赖 -->
<include>
<groupId>com.alya</groupId>
<artifactId>alya-common</artifactId>
</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>
结果:
解压看lib包下面确实只保留了alya-common的包
启动运行
精简后的 jar 包是不能直接通过 java -jar handover-demo.jar 运行的,因为缺少了依赖包。
我们需要在运行的时候,指定外部依赖包的位置即可。命令如下:
# 例如服务器lib的路径为:/v1/lib
java –Dloader.path=/v1/lib -jar handover-demo.jar
如果lib分散存放在不同路径,可以用逗号隔开,例如:
java –Dloader.path=/v1/lib,/v2/lib -jar handover-demo.jar