如何减小Spring Boot项目jar包体积

相信大部分Java开发者在使用SpringBoot开发项目时,经常会遇到代码频繁改动,每次打包部署到开发/测试环境时,由于jar包体积过大,上传jar包消耗了大量的时间,下面介绍如何给SpringBoot项目jar包减肥(使用maven作为打包工具)

注:Spring Boot版本:2.5.7、JDK版本:jdk8

jar包体积

可以看到,一个普通的Spring Boot项目,其生成的jar包体积就高达几十近百兆


jar包结构

解压生成的jar包,查看其目录结构

  • BOOT-INF

    • classes 业务代码
    • lib 项目依赖
  • META-INF

    • maven maven配置信息
    • MANIFEST.MF jar包的描述信息和属性
    • spring-configuration-metadata.json 配置提示信息,使用IDE编写配置文件会有提示
  • org

    • springframework 启动jar包需要的class


修改maven打包配置

  • 修改项目pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>

    <configuration>
    <layout>ZIP</layout>
    <includes>
    <include>
    <groupId>nothing</groupId>
    <artifactId>nothing</artifactId>
    </include>
    </includes>
    </configuration>
    </plugin>
    </plugins>
    </build>
  • 使用maven重新打包,可以发现现在的jar包体积比原来要小很多


准备jar包运行需要的依赖

  • 不修改maven打包配置,生成带有lib目录的jar包,然后解压将lib目录单独提取出来

  • 修改maven打包配置,将依赖copy到指定目录

    在plugins标签中添加下面内容,如果maven-dependency-plugin找不到,可以先引入该依赖,然后删除该依赖配置,以后每次打包后在target目录下会生成一个lib依赖目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
    <execution>
    <id>copy-dependencies</id>
    <phase>prepare-package</phase>
    <goals>
    <goal>copy-dependencies</goal>
    </goals>
    <configuration>
    <outputDirectory>${project.build.directory}/lib</outputDirectory>
    </configuration>
    </execution>
    </executions>
    </plugin>

运行瘦身后的jar包(仅限JDK8版本)

  • 通过指定loader.path参数指定依赖目录

    1
    java -Dloader.path=./lib -jar user-0.0.1-SNAPSHOT.jar

  • 通过指定java.ext.dirs参数,注意不能覆盖原有的依赖($JAVA_HOME/jre/lib/ext),可以通过:添加多个依赖

    1
    java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./lib -jar user-0.0.1-SNAPSHOT.jar

    ==注意:==java.ext.dirs参数在JDK8以上版本好像不支持