SpringBoot项目jar包瘦身

一、背景:

  现在使用SpringBoot微服务的场景下,一个项目可能会引入很多个jar包依赖,这样带来的问题就是jar包特别臃肿,包含动辄几百MB的jar包文件。

这样每次进行发布的时候,需要传输这么大的jar包文件,不单单是对资源带宽的消耗,也白白浪费很多时间等待……

  为了解决这种部署的痛点,我们可以将经常要变的jar包和项目class打包在一块,将很少、不会被修改的jar包单独打包到lib下,像以往的mvc项目部署一样。

二、瘦身原理

  解压下正常打包的jar包,可以看到将所有的jar包都打包在了一块

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

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

?SpringBoot项目jar包启动瘦身_maven

三、如何打包和启动项目

打包

mvn clean package

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
                <!--
                    这里是填写需要包含进去的jar,
                    必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
                    如果没有则nothing ,表示不打包依赖
                -->
                <includes>
                    <include>
                        <groupId>nothing</groupId>
                        <artifactId>nothing</artifactId>
                    </include>
                    <!--
                        比如项目引入公司其他项目工具类
                        工具类可能经常需要被修改,那么就应该将其坐标写进来
                        这样就会将公司common工具类打包进主启动jar包中去
                    -->
                    <include>
                        <groupId>com.asp</groupId>
                        <artifactId>asp-common</artifactId>
                    </include>
                </includes>
            </configuration>
        </plugin>
        <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>

如上面配置所示,将common依赖单独打包,而其他依赖被打包到了target下的lib下了,如下图:

?SpringBoot项目jar包启动瘦身_jar包_02

启动

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

?SpringBoot项目jar包启动瘦身_jar_03