SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身

Posted 守夜人爱吃兔子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身相关的知识,希望对你有一定的参考价值。

前言

工作中终于遇到比较好玩的东西了,最近被给了一个需求,将pom中的第三方依赖移到外面而不直接打包进jar包。那直接打包有什么问题吗?下面我们一起来看看。

 

直接打包的缺点

首先宣读一下直接打包的“三大罪”!!!

  • 如果项目依赖的第三方包非常多,那么最终提供出去的jar包将非常大,上传所需时间也非常多
  • 如果依赖的第三方包版本升级了,想要直接用最新的版本就只能修改版本然后重新打包了
  • 如果依赖的某个第三方包有安全漏洞,那么必须换版本,换版本的话就必须重新进行打包。就暴露出fastjson的安全漏洞,版本小于1.2.68存在反序列化的漏洞

第二点和第三点差不多,都是由版本导致重新打包
但是如果我们打包时不将依赖的第三方包打包进去,那么最后的jar包不仅小,而且当依赖的第三方版本发生变化时也不需要重新打包了,心动不如行动,现在对自己的项目手起刀落改造一下吧

 

pom文件的修改

在maven项目中配置打包相关的东西是在pom文件中的,一般情况下,在pom中如果不需要将第三方包排除在外,都是这样配置的:

<build>
    <finalName>authsdk-service-${version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <finalName>authsdk-service-${version}</finalName>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

看一下打包后jar包的大小

大小为27515KB,可以发现jar包的内容中,在BOOT-INF/lib目录下都是依赖的第三方包

发现了吗?真相只有一个!导致打包出来的jar包大的原因就是这些依赖的第三方包。
那既然问题原因出现了,就可以开始对症下药解决问题了,我们对pom文件做一个改动,让它不将第三方依赖打包进去,修改后的配置:

 <build>
    <finalName>authsdk-service-${version}</finalName>
    <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
             <configuration>
                <!-- 此处为项目的主类路径 -->
                <mainClass>com.xxx.authsdk.AuthsdkServiceApplication</mainClass>
                 <layout>ZIP</layout>
                <includes>
                    <include>
                        <!-- 排除所有的第三方依赖的Jar包 -->
                         <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>8</source>
                 <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

修改完后重新打包

jar包大小变为1702KB,瘦身效果很明显!!!相比之前直接变小了94%,同时查看jar包内容/BOOT-INF下没有lib文件夹了,确实没有将第三方依赖打包进去。
那到这里是不是已经完事了?不,其实还可以做得更好!因为打包时没有将第三方依赖打包进去,因此启动的时候需要指定第三方依赖的位置程序才能正常启动,这就要求我们必须从最开始未瘦身的jar包中将lib文件夹给抠出来,但这样的做法就稍微有点low了。maven提供了一种显示指定lib文件夹保存路径的方法,在之前的pom文件基础上加下如下配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <!-- 复制第三方 jar 到指定路径下 下 -->
                <outputDirectory>G:/java工程/authorize_service/lib</outputDirectory>
                <excludeScope>provided</excludeScope>
                <!-- 配置的作用:跳过复制第三方依赖这一步。这是在首次上传
                第三方依赖到服务器之后,启用这个选项,可以不用在打包时
                重复复制,节省时间。-->
                <skip>false</skip>
            </configuration>
        </execution>
    </executions>
</plugin>

通过<outputDirectory>指定lib目录保存路径为当前项目路径下

 

项目启动

因为没有将第三方依赖打包进去,因此启动时必须显示指定第三方依赖路径

  • 相对路径:java -Dloader.path=\\lib -jar xxx.jar
  • 绝对路径:java -Dloader.path=/xxx/lib -jar xxx.jar

 

最后

Java的学习是一条漫长的道路,每个地方都是值得学习的内容。

在实际工作中,我们会遇到各种各样的需求,但是不要慌!只要我们静下心来,弄清需求,理清逻辑,打磨细节,做到这三点,绝大部分的难题都可以迎刃而解。

 

我自己这段时间整理了一些java最重要最热门的学习方向资料如果有需要的可以【点击此处】领取,里面还有不同方向的学习思维导图、java核心面试题知识点整理、及系列源码笔记等。

欢迎大家一起学习和探讨。

 

 

以上是关于SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身的主要内容,如果未能解决你的问题,请参考以下文章

基于java ssm springboot实现选课推荐交流平台系统设计和实现必须收藏

ACM_夏天到了,又到了出游的季节

SpringBoot实现浏览器端大文件分块上传

摧残孩子的最佳方式,就是以慈爱之名请他吃冰淇淋!

夏天来啦,用纯CSS实现水果解解馋吧

怎么用批处理bat来给文件(txt)内容添加一行