美文网首页
夏天到了,来给jar包瘦个身!

夏天到了,来给jar包瘦个身!

作者: 何甜甜在吗 | 来源:发表于2021-05-24 13:56 被阅读0次

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

    直接打包的缺点

    列一下直接打包的三宗罪!!!

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

    第二点和第三点差不多,都是由版本导致重新打包
    但是我们打包时不将依赖的第三方包打包进去,那么最后的jar包不仅小,而且当依赖的第三方版本发生变化时不需要重新打包了

    image

    既然排除第三方包可以带来这么多好处,心动不如行动,赶紧对自己的项目大刀阔斧改造一下吧

    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包的大小

    image

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

    image

    很明显,这些依赖的第三方包是导致打包出来的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>
    

    修改完后重新打包

    image

    jar包大小变为1702KB,是原来的50分之3,瘦身效果很明显!!!
    同时查看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

    相关文章

      网友评论

          本文标题:夏天到了,来给jar包瘦个身!

          本文链接:https://www.haomeiwen.com/subject/ilgudltx.html