1.背景
SpringBoot打包的Jar包,一般少则几十M,大则上百或者几百M。如果用Jar包部署的话,Jar包上传到服务器环境,视带宽情况,快则十几秒到几十秒不等。每次都需要上传一个上百M的大文件,影响效率。如果是需要走公网上传到云服务器,还要耗费不少带宽成本。
Jar包里容量最大的是依赖包(dependencies),除去依赖的Jar包一般就几十几百K,而依赖包一般来说极少有变化,如果构建Jar的时候,把依赖包分离开,当依赖没变化,只更新Jar包,依赖项有变化时,再一起上传更新。这样,大部分构建部署,只需要上传几百K的Jar包到服务器。效率会大大提高。
2.实现流程
相关版本说明:
Maven:3.5SpringBoot:2.4.2
2.1.配置ClassPath路径
利用maven-jar-plugin插件,把lib文件夹配置成ClassPath。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest><manifestEntries><Class-Path>./</Class-Path></manifestEntries></archive></configuration></plugin>
2.2.配置Jar包构建信息
使用spring-boot-maven-plugin插件构建Jar包
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources><!--手动设置构建需要加入的依赖,只有配置的依赖才会加入。--><includes><!--配置一个不存在的groupId,这样就不会引入任何依赖,jar包就只包含代码文件--><include><groupId>not-exists</groupId></include><!--如果是多模块项目,其他模块需要手动添加下面--></includes></configuration></plugin>
2.3.把依赖拷贝到指定路径
使用maven-dependency-plugin插件把依赖包拷贝到上述步骤配置的路径下
<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>
2.4.完整构建配置
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><!-- 自定义ClassPath路径 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><!-- 把构建根目录的lib文件夹配置成ClassPath路径 --><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest><manifestEntries><Class-Path>./</Class-Path></manifestEntries></archive></configuration></plugin><!--配置Jar包构建信息--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources><!--手动设置构建需要加入的依赖,只有配置的依赖才会加入。--><includes><!--配置一个不存在的groupId,这样就不会引入任何依赖,jar包就只包含代码文件--><include><groupId>not-exists</groupId></include><!--如果是多模块项目,其他模块需要手动添加下面--></includes></configuration></plugin><!--把依赖拷贝到Lib路径--><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></plugins></build>
2.5.最终效果
执行mvn clean package,targe目录如下:


可以看到,Jar包只有293K大小,50M的依赖包已经移到根目录下的lib文件夹,由于已经配置lib文件夹为ClassPath,因此直接运行jar包就可以启动应用。

