查看原文
其他

把 Spring Boot 3.3项目从 31.5M 瘦身到 0.82M,部署超级快

路条编程 路条编程
2024-09-05


把 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 按钮,如下图所示,

执行后在项目 target 目录得到的Jar包 vehicle-image-capture-0.0.1-SNAPSHOT.jar,转到 target 目录,使用命令 jar -xvf ./vehicle-image-capture-0.0.1-SNAPSHOT.jar 解压 jar 包,目录结构如下:

整个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 包、优化部署流程,成为解决这些问题的关键所在。


今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。


AI资源聚合站已经正式上线,该平台不仅仅是一个AI资源聚合站,更是一个为追求知识深度和广度的人们打造的智慧聚集地。通过访问 AI 资源聚合网站 https://ai-ziyuan.techwisdom.cn/,你将进入一个全方位涵盖人工智能和语言模型领域的宝藏库。


作者:路条编程(转载请获本公众号授权,并注明作者与出处)


继续滑动看下一个
路条编程
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存