一、需求背景

我们知道Spring Boot项目,是可以通过java -jar 包名 启动的。

那为什么Spring Boot项目可以通过上述命令启动,而其它普通的项目却不可以呢?

原因在于我们在通过以下命令打包时

mvn clean package

一般的maven项目的打包命令,不会把依赖的jar包也打包进去的,所以这样打出的包一般都很小

编辑切换为居中

添加图片注释,不超过 140 字(可选)

但Spring Boot项目的pom.xml文件中一般都会带有spring-boot-maven-plugin插件。

该插件的作用就是会将依赖的jar包全部打包进去。该文件包含了所有的依赖和资源文件。

也就会导致打出来的包比较大。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

打完包就可以通过java -jar 包名 启动,确实是方便了。

但当一个系统上线运行后,肯定会有需求迭代和Bug修复,那也就免不了进行重新打包部署。

我们可以想象一种场景,线上有一个紧急致命Bug,你也很快定位到了问题,就改一行代码的事情,当提交代码并完成构建打包并交付给运维。

因为打包的jar很大,一直处于上传中.......

如果你是老板肯定会发火,就改了一行代码却上传几百MB的文件,难道没有办法优化一下吗?

如今迭代发布是常有的事情,每次都上传一个如此庞大的文件,会浪费很多时间。

下面就以一个小项目为例,来演示如何瘦身。

二、瘦身原理

这里有一个最基础 SpringBoot 项目,整个项目代码就一个SpringBoot启动类,单是打包出来的jar就有20多M;

我们通过解压命令,看下jar的组成部分。

tar -zxvf spring-boot-maven-slim-1.0.0.jar

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们可以看出,解压出来的包有三个模块

分为 BOOT-INF,META-INF,org 三个部分

打开 BOOT-INF

编辑切换为居中

添加图片注释,不超过 140 字(可选)

classes: 当前项目编译好的代码是放在 classes 里面的,classes 部分是非常小的。

lib: 我们所依赖的 jar 包都是放在 lib 文件夹下,lib部分会很大。

看了这个结构我们该如何去瘦身呢?

项目虽然依赖会很多,但是当版本迭代稳定之后,依赖基本就不会再变动了。

如果可以把这些不变的依赖提前都放到服务器上,打包的时候忽略这些依赖,那么打出来的Jar包就会小很多,直接提升发版效率。

当然这样做你肯定有疑问?

既然打包的时候忽略这些依赖,那通过java -jar 包名 还可以启动吗?

这种方式打的包,在项目启动时,需要通过-Dloader.path指定lib的路径,就可以正常启动

java -Dloader.path=./lib -jar xxx.jar

三、瘦身实例演示

1、依赖拆分配置

只需要在项目pom.xml文件中添加下面的配置:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> <layout>ZIP</layout> <!--这里是填写需要包含进去的jar, 必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来 如果没有则nothing ,表示不打包依赖 --> <includes> <include> <groupId>nothing</groupId> <artifactId>nothing</artifactId> </include> </includes> </configuration> </plugin> <!--拷贝依赖到jar外面的lib目录--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!--指定的依赖路径--> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>

再次打包

mvn clean package

编辑切换为居中

添加图片注释,不超过 140 字(可选)

发现target目录中多了个lib文件夹,里面保存了所有的依赖jar。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

自己业务相关的jar也只有小小的168kb,相比之前20.2M,足足小了100多倍;

这种方式打的包,在项目启动时,需要通过-Dloader.path指定lib的路径:

java -Dloader.path=./lib -jar spring-boot-maven-slim-1.0.0.jar

编辑切换为居中

添加图片注释,不超过 140 字(可选)

虽然这样打包,三方依赖的大小并没有任何的改变,但有个很大的不同就是我们自己的业务包和依赖包分开了;

在不改变依赖的情况下,也就只需要第一次上传lib目录到服务器,后续业务的调整、bug修复,在没调整依赖的情况下,就只需要上传更新小小的业务包即可;

2、自己其它项目的依赖如何处理?

我们在做项目开发时,除了会引用第三方依赖,也会依赖自己公司的其它模块。

比如

编辑

添加图片注释,不超过 140 字(可选)

这种依赖自己其它项目的工程,也是会经常变动的,所以不宜打到外部的lib,不然就会需要经常上传更新。

那怎么做了?

其实也很简单 只需在上面的插件把你需要打进jar的填写进去就可以了

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> <layout>ZIP</layout> <!--这里是填写需要包含进去的jar,如果没有则nothing --> <includes> <include> <groupId>com.jincou</groupId> <artifactId>xiaoxiao-util</artifactId> </include> </includes> </configuration> </plugin>

这样只有include中所有添加依赖依然会打进当前业务包中。

四、总结

使用瘦身部署,你的业务包确实小了 方便每次的迭代更新,不用每次都上传一个很大的 jar 包,从而节省部署时间。

但这种方式也有一个弊端就是增加了Jar包的管理成本,多人协调开发,构建的时候,还需要专门去关注是否有人更新依赖。

资源获取:
大家 点赞、收藏、关注、评论啦 、 查看

如何优雅的给SpringBoot部署的jar包瘦身?相关推荐

  1. 给你的SpringBoot工程打的jar包瘦瘦身

    Spring boot默认方式打包由于打的是全量依赖包(也称为fat包),不但打包慢,体积大,传输也慢,今天教大家给spring boot瘦瘦身. 背景 现在微服务架构越来越流行,一个项目10多个基于 ...

  2. jar包瘦身的方法和思考

    前情提要:近期发现jar包有点大,加上网速不给力,上传到远程服务器上时间有点长.于是想把jar包瘦身一下,网上冲浪了一下,有了以下内容. 原因 代码编译后jar包大的主要原因是依赖包占了大量空间 解决 ...

  3. springboot jar包瘦身

    文章目录 1.普通的打包方式 2.优化后的打包方式 3.遇到的问题 说明: 该博文基于springboot 2.4.2版本测试. 1.普通的打包方式 <build><plugins& ...

  4. maven jar包瘦身

    springCloud项目系统瘦身记录 第一章 **尝试spring-boot-thin-launcher** Spring Boot项目可以通过spring-boot-maven-plugin插件打 ...

  5. 使用Spring Boot Thin Launcher 打包Spring Boot项目,jar包瘦身

    原文地址:https://www.jianshu.com/p/3fa4039d90d7 -------------------------------------------------------- ...

  6. 使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没有包含的解决方法

    使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没有包含的解决方法 参考文章: (1)使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没 ...

  7. SpringBoot中文件下载、拦截器、war包部署、jar包部署

    3. SpringBoot中文件下载 将可以被下载资源放在磁盘的 D:\springbootcodes\springboot_day6\download 路径 这里我们使用jsp开发 引入依赖使tom ...

  8. 关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

    前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下 关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源 问题描述 在部署了一个项目之后,打开项目页面进行测试,发现有一 ...

  9. Dockerfile中通过ENV指定动态参数在RUN时传递参数(部署后台jar包时指定端口为例)

    场景 CentOS7中使用Dockerfile部署后台jar包: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119818808 ...

最新文章

  1. 【数据结构】树状数组 例题剖析
  2. Hadoop运维记录系列(十四)
  3. oracle 空间数据处理,Oracle数据库空间数据的处理
  4. 运用runtime与AOP实现oc中的kvo
  5. Oracle11g不能导出空表问题
  6. linux 命令api,linux命令行下字典,使用有道API
  7. 大学计算机基础实训excel,大学计算机基础实训指导书
  8. PHP解决方案@时间差异计算函数
  9. OpenCV:使用python-cv2实现Harr+Adaboost人脸识别
  10. HIVESQL中ROW_NUMBER() OVER语法以及示例
  11. 深入理解Java虚拟机2——内存管理机制及工具
  12. cacti 监控自身
  13. 当PCB设计师遇到爱情,猜猜他板内的阻抗有多大变化
  14. OpenGL+VS2015相关类库配置
  15. 用adSence赚钱三部曲
  16. leetcode 二分法 最大值最小化/最小值最大化
  17. 推荐系统-协同过滤算法简介简化版实例
  18. 魅族mx6 原生android,苹果和谷歌都要向它学习!看外媒如何评价魅族MX6
  19. c语言最短加法链问题回溯法,《回溯法习题》PPT课件.ppt
  20. 电商SaaS不好做,有赞亏到了末路?

热门文章

  1. 热门 | 细胞死亡家族再添新成员——铜死亡
  2. qcustomplot使用教程--基本绘图
  3. react native学习与实践(3)使用加密解密库CryptoJS的sha256
  4. C语言File相关的API
  5. 中国光伏产业发展现状:光伏发展势头强劲,2021年我国光伏累计装机达3.06亿千瓦(附光伏装机容量、发电量、主要产品产量)[图]
  6. proteus仿真STM32时时钟问题解决方案
  7. 旭宇同创:拼多多商品怎么定价?
  8. clob类型(数据库clob类型)
  9. 【软件工程】开源软件
  10. PLC模拟量输出 模拟量转换 S_RTI(CODESYS平台 ST代码)