SpringBoot项目的依赖,我们一般都会采用Maven管理,整个项目,一般都分为以下几部分:
三方依赖通过pom.xml文件配置,添加到项目中来特点:变化小,占用空间大
业务代码特点:变化大,占用空间小
静态资源特点:变化适中,占用空间大;不过一般的静态资源都另外管理,很少会直接放在项目里面;
而整个项目通常会被构建成一个Jar,上传到服务器运行;整个Jar包中,三方依赖会被一并打包进去,占用空间最大的,也就是这部分依赖包;
比如下面这个最基本的测试 SpringBoot 项目,就一个简单的hello world接口,但是打包出来的jar就有20多M;
![](https://i-blog.csdnimg.cn/blog_migrate/abe114d222041d5065ae97ffdf646a7a.jpeg)
把Jar包解压之后,发现三方依赖竟然比整个Jar包都大(可能压缩的原因),自己的代码只有100多K;
这还只是一个最基础的项目,如果业务复杂,依赖多,光是三方包可能就占用几十、几百M之多;
由于依赖包变化小,占用空间大的特点,大部分情况是第一次添加之后,后面很少会去调整;但每次修改哪怕是一行代码,都需要重新把他们构建Jar中去,往服务器上传、发布,白白消耗了大量的资源、带宽以及时间;
那能否将三方依赖和自己的业务代码分开打包呢?答案是:可以的;
只需要在pom.xml中插入以下文件,即可拆开lib和jar
<build>
<!-- 设置构建的 jar 包名 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.6</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 -->
<configuration>
<fork>true</fork>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!-- 拆开依赖-->
<mainClass>cn.iocoder.qingning.server.QingningServerApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<!-- 排除所有Jar -->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 将引入的 jar 打入其中 -->
</goals>
</execution>
</executions>
</plugin>
<!--此插件用于将依赖包抽出-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
再次构建
mvn clean package -DskipTests=true
发现target目录中多了个lib文件夹,里面保存了所有的依赖jar,自己业务相关的jar也只有小小的157kb,相比之前21M,足足小了100多倍;
![](https://i-blog.csdnimg.cn/blog_migrate/d8e0ea15738e87db89ef4ddb1f018ed7.png)
这种方式打的包,在项目启动时,需要通过-Dloader.path指定lib的路径:
java -Dloader.path=./lib -jar xxx.jar