开篇
最近公司开发的微服务项目多了,开发出来的项目各个百十来M,而且是用的云服务器,上传云服务器的时候上传半天。恨得我压根直痒痒!所以只好看看有没有使jar包瘦身的方法。结果一搜还真得挺多!今天就拿一个网上找的开源项目实战一下。以后spring boot 项目打的包在也不会动不动几十上百兆了。关注转发收藏吧。项目中例子源码的项目请移步至文章末尾。

实际业务代码只有几十k而已
其实整个开源项目 分为网关、注册中心、配置中心,核心验证服务的总大小也才13M。我们大多数情况下写的代码也都是几十K最多到几兆而已,不会再多了。如下图所示:

但是我们打出来的包呢?来看我实际打的包邮多大。达到惊人的454M。你说气人不气人。这要是传到服务器,特别是云服务器也是很要命的,在发布频繁的时候。

瘦身原理
我们先拿注册中心为例,大概介绍一下瘦身原理。用压缩工具,打开看此开源项目中的注册中心的jar包解刨如下:此时此jar包为接近50M。其实大部分都在jar包里的lib下。



是不是有种豁然开朗的感觉。原来jar包是这样的。那我们能不能把jar包移动出来当成公共的呢?当然可以了。这就是瘦身的方法。把很多项目公用的jar包放在一个文件夹内就好了。
瘦身开始
还是以单个注册中心项目为例。插件进行以下修改。
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
<layout>ZIP</layout>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<includeScope>runtime</includeScope>
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
<excludeGroupIds>
</excludeGroupIds>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

然后在打jar包。看看是多大。5k 我就问你是什么概念,就是一个几十M的东西到几k。此时其他依赖的jar包不是没有了,而是拷贝出来了,之后你放在服务器上一个文件夹中,上传一次后,就在也不用上传了。

运行时候注意
在linux系统中,指定你依赖jar包位置,用的是Dloader.path指定jar包依赖的位置 注意了。
nohup java -Dloader.path="***/lib" -jar xxxx.jar &
结语
工作有困难,但办法总比困难多。只要想解决办法还是有的。如果有需要此项目源码的请参考另外一篇文章。这里就说什么了。觉得有用就关注一下吧。
Java 开源的基于微服务 Spring cloud 快速开发脚手架调试实战
另外我还调试了其他很多开源项目,感兴趣的可以去看看
基于Java spring boot 的区块链开源系统调试实战
Blockchain 区块链技术开发开源教程合集
花了三个小时调试 集合近50种常用小工具 开源项目
Java Springboot 开源微服务架构管理后台搭建实战
仿京东 SSO 调试开源的 单点登录 项目实战
Java 史上最全集成第三方登录 开源项目的调试实战
Java 分布式架构的 开源的支付项目 调试实战
Java 百分之百 开源的 基于Spring boot 的ERP 系统调试实战
开源的 OA 项目 调试实战