把 Spring Boot 3.3 项目从 31.5M 瘦身到 0.82M,部署超级快!
Spring Boot 在部署方面,于公司内网环境中,其表现尚可,部署过程相对简便,速度也能让人接受。然而,当涉及到公网部署,尤其是在诸如阿里云等云服务器上时,问题便接踵而至。编译生成的 Jar 包往往体积庞大,这主要归因于项目中引入的众多开源组件,例如 Spring Cloud 等。这种庞大的体积不仅增加了部署的时间成本和资源消耗,还可能引发一系列潜在的问题。
当需要对线上正在运行的工程进行哪怕是细微的调整时,都会遭遇重重困难。过大的 Jar 包使得更新和调试的过程变得异常繁琐和耗时,严重影响了开发和运维的效率。同时,这也增加了出错的风险,因为任何微小的改动都可能在庞大而复杂的依赖关系中引发意想不到的错误。
瘦身前的Jar包
Tomcat在部署Web工程的时候,可以进行增量更新,SpringBoot也是可以的。
SpringBoot编译出来的Jar包中,磁盘占用大的,是一些外部依赖库(jar包)。
在Eclipse 里打开前天发布的车牌识别系统图像采集项目,点击Debug 按钮下的 Debug Configurations 菜单,在 Goals 里输入 clean install 命令,点击弹窗下的 Debug 按钮,如下图所示,
整个Jar包 31.5 MB, 但是 BOOT-INF/lib 就占用了将近 30.7 MB:
三、解决方法
步骤1: 正常编译JAR包,解压出lib文件夹
POM文件如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在 Eclipse 中再次执行Debug命令,将编译后的Jar包解压,拷贝 BOOT-INF 目录下的lib文件夹到目标路径 /Users/icoderoad/Desktop/vehicle-image-capture/lib;
步骤2: 修改pom.xml配置,编译出不带 lib 文件夹的Jar包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.icoderoad.lprsystem.VehicleImageCaptureApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置完成后,再次执行 Debug 按钮,进行编译
生成的 Jar 包体积明显变小,使用 jar -xvf ./vehicle-image-capture-0.0.1-SNAPSHOT.jar 如下所示,
外部的 jar 包已经不会被引入了:
**步骤3:**运行编译后的Jar包
将 步骤1 解压出来的lib文件夹、步骤2编译的jar包放在同一个目录 /Users/icoderoad/Desktop/vehicle-image-capture , 运行下面命令:
java -Dloader.path=/Users/icoderoad/Desktop/vehicle-image-capture/lib -jar /Users/zjp/Desktop/vehicle-image-capture/vehicle-image-capture-0.0.1-SNAPSHOT.jar
或者在maven中输入一下命令导出需要用到的jar包
mvn dependency:copy-dependencies -DoutputDirectory=/Users/icoderoad/Desktop/vehicle-image-capture/lib -DincludeScope=runtime
备注:
将 /Users/icoderoad/Desktop 改成自己机器的实际的路径。
-Dloader.path=lib文件夹路径
最终目录文件结构是:
├── lib #lib文件夹
└── vehicle-image-capture-0.0.1-SNAPSHOT.jar
说明
1、通常,一个工程项目架构确定后,引入的jar包基本上不会变,改变的大部分是业务逻辑;
2、后面如果需要变更业务逻辑,只需要轻量地编译工程,大大提高项目部署的效率。
总结:
公网环境下,Spring Boot 项目由于 Jar 包的过度臃肿,给部署、更新以及日常的维护和微调带来了极大的挑战。这不仅阻碍了项目的快速迭代和优化,也对资源的有效利用和开发运维的效率产生了负面影响。因此,寻找切实可行的方法来精简 Jar 包、优化部署流程,成为解决这些问题的关键所在。