1.什么是瘦身
瘦身: thinBody 又称 “减肥”、“减重”。 就是合理、科学的减轻自身重量的。SpringBoot 应用瘦身顾名思议:就是将 SpringBoot 应用打包的 jar 利用合理的方式、方法减小体积。
总结:简单来说就是将jar包依赖分开(一部分是自己的写的代码,另部分是第三方使用的依赖库)
2.为什么瘦身
场景: 现有的应用开发中,不论是单体架构、微服务架构,如果项目采用的是 springboot、springcloud 来作为底层框架,打包时最终都会以jar包的方式打包、部署。这是就会面临一个问题,就是 jar 包非常大,单体应用还好,但是如果是微服务就非常痛苦,几十个微服务就要拆分打包几十个 jar 包,每个 jar 包都很大(几百M),合起来就好几个 GB,非常占用空间。如果是内网部署,遇到动辄GB的升级包还能勉强接受,最多就是运维心里默默地吐槽一下,但是如果在外网云环境、或者客户现场,那令人痛不欲生的带宽加上各种网络转换限制,运维心里各种🐴。因为这个你的领导又给你各种批头盖脸一顿。
你觉得很委屈😢,确实不是你的代码问题,但是这确实是我们该考虑的。因此呢?基于以上原因我们要为项目进行瘦身!
3.如何瘦身
瘦身思路:
将jar分开两部分(一部分是自己的写的代码,另部分是第三方使用的依赖库)
3.1 引入插件依赖
剥离第三方依赖
依赖可以不修改:在打包的时候,将第三方依赖运行时的依赖copy到 target/lib 目录下,
<!-- 此插件用于将依赖包抽出-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<!-- package打包的时候生效 -->
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--第三方依赖copy到 target/lib 目录下 -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!--是否排除传递性 -->
<excludeTransitive>false</excludeTransitive>
<!--是否去掉 jar 包版本信息 -->
<stripVersion>false</stripVersion>
<!--包含范围 runtime 运行时 -->
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
打包插件(整个,可以忽略)
注意:这是整个打包插件,看看就行 重点在下面(如果看只看 configuration 标签内的内容)
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--修改一:修改为自己的启动应用-->
<mainClass>com.ruoyi.RuoYiApplication</mainClass>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<layout>ZIP</layout>
<!--配置需要打包进项目的jar-->
<includes>
<!--修改二:
这里是填写需要包含进去的jar,
必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
如果没有则non-exists ,表示不打包依赖
-->
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
打包插件(重点)
我们只需要将这个 configuration 标签内容放到打包插件中,然后修改相对应地内容
<configuration>
<!--修改一:修改为自己的启动应用-->
<mainClass>com.ruoyi.RuoYiApplication</mainClass>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<layout>ZIP</layout>
<!--配置需要打包进项目的jar-->
<includes>
<!--修改二:排处的jar包
这里是填写需要包含进去的jar,比如 应用中common包之类
必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
如果没有则non-exists ,表示不打包依赖
-->
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
3.2 瘦身后查看
3.4 如何运行
-Dloader.path=./lib 指定第三方依赖库的文件地址
java -jar -Dloader.path=./lib ruoyi.jar