以项目中微服务的block模块做举例,先上没瘦身之前的jar包。
再来看看打包瘦身之后的jar包大小,大小不是小了一点点。
瘦身准备
1.首先我们要对Jar包有一个初步认识,它的内部结构如下
example.jar
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-BOOT-INF
+-classes
| +-mycompany
| +-project
| +-YourClasses.class
+-lib
+-dependency1.jar
+-dependency2.jar
运行该Jar时默认从BOOT-INF/classes
加载class,从BOOT-INF/lib
加载所依赖的Jar包。如果想要加入外部的依赖Jar,可以通过设置环境变量LOADER_PATH
来实现。
如此一来,就可以确认我们的思路了:
1. 把那些不变的依赖Jar包(比如spring依赖、数据库Driver等,这些在不升级版本的情况下是不会更新的)从Flat Jar中抽离到单独的目录,如libs
2. 在启动Jar时,设置LOADER_PATH
使用上一步的libs
这样,我们最终打包的jar包体积就大大减少,每次迭代后只需要更新这个精简版的Jar即可。
具体步骤
1.先备份原先的jar包,找到jar包打开我们发现BOOT-INF下的lib里有好多的jar包,我们将这些jar包先存到一个文件夹里。
2.修改pom.xml,如图,设置为nothing,将在打包时剔除所有引入的jar包,我这里把常用的工具类common也作为jar包剔除出去了,最后直接加到了totallib里了。
<dependency>
<groupId>com.data_fusion</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.1.RELEASE</version>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
3.如何运行
我们整个项目一次打完包就是这样的,其中totallib里就是我们整个项目所有引用的jar包了,如图。
我们启动时只需要加上-Dloader.path=totallib,启动命令:java -Dloader.path=totallib -jar block_controller-1.0.0.jar --spring.profiles.active=test