詳解如何給SpringBoot部署的jar包瘦身
一、需求背景
我們知道Spring Boot項目,是可以通過java -jar 包名 啟動的。
那為什么Spring Boot項目可以通過上述命令啟動,而其它普通的項目卻不可以呢?
原因在于我們在通過以下命令打包時
mvn clean package
一般的maven項目的打包命令,不會把依賴的jar包也打包進去的,所以這樣打出的包一般都很小

但Spring Boot項目的pom.xml文件中一般都會帶有spring-boot-maven-plugin插件。
該插件的作用就是會將依賴的jar包全部打包進去。該文件包含了所有的依賴和資源文件。
也就會導致打出來的包比較大。

打完包就可以通過java -jar 包名 啟動,確實是方便了。
但當一個系統(tǒng)上線運行后,肯定會有需求迭代和Bug修復,那也就免不了進行重新打包部署。
我們可以想象一種場景,線上有一個緊急致命Bug,你也很快定位到了問題,就改一行代碼的事情,當提交代碼并完成構(gòu)建打包并交付給運維。
因為打包的jar很大,一直處于上傳中.......
如果你是老板肯定會發(fā)火,就改了一行代碼卻上傳幾百MB的文件,難道沒有辦法優(yōu)化一下嗎?
如今迭代發(fā)布是常有的事情,每次都上傳一個如此龐大的文件,會浪費很多時間。
下面就以一個小項目為例,來演示如何瘦身。
二、瘦身原理
這里有一個最基礎(chǔ) SpringBoot 項目,整個項目代碼就一個SpringBoot啟動類,單是打包出來的jar就有20多M;
我們通過解壓命令,看下jar的組成部分。
tar -zxvf spring-boot-maven-slim-1.0.0.jar

我們可以看出,解壓出來的包有三個模塊
分為 BOOT-INF,META-INF,org 三個部分
打開 BOOT-INF

classes: 當前項目編譯好的代碼是放在 classes 里面的,classes 部分是非常小的。
lib: 我們所依賴的 jar 包都是放在 lib 文件夾下,lib部分會很大。
看了這個結(jié)構(gòu)我們該如何去瘦身呢?
項目雖然依賴會很多,但是當版本迭代穩(wěn)定之后,依賴基本就不會再變動了。
如果可以把這些不變的依賴提前都放到服務器上,打包的時候忽略這些依賴,那么打出來的Jar包就會小很多,直接提升發(fā)版效率。
當然這樣做你肯定有疑問?
既然打包的時候忽略這些依賴,那通過java -jar 包名 還可以啟動嗎?
這種方式打的包,在項目啟動時,需要通過-Dloader.path指定lib的路徑,就可以正常啟動
java -Dloader.path=./lib -jar xxx.jar
三、瘦身實例演示
1、依賴拆分配置
只需要在項目pom.xml文件中添加下面的配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<layout>ZIP</layout>
<!--這里是填寫需要包含進去的jar,
必須項目中的某些模塊,會經(jīng)常變動,那么就應該將其坐標寫進來
如果沒有則nothing ,表示不打包依賴 -->
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
<!--拷貝依賴到j(luò)ar外面的lib目錄-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--指定的依賴路徑-->
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>再次打包
mvn clean package

發(fā)現(xiàn)target目錄中多了個lib文件夾,里面保存了所有的依賴jar。

自己業(yè)務相關(guān)的jar也只有小小的168kb,相比之前20.2M,足足小了100多倍;
這種方式打的包,在項目啟動時,需要通過-Dloader.path指定lib的路徑:
java -Dloader.path=./lib -jar spring-boot-maven-slim-1.0.0.jar

雖然這樣打包,三方依賴的大小并沒有任何的改變,但有個很大的不同就是我們自己的業(yè)務包和依賴包分開了;
在不改變依賴的情況下,也就只需要第一次上傳lib目錄到服務器,后續(xù)業(yè)務的調(diào)整、bug修復,在沒調(diào)整依賴的情況下,就只需要上傳更新小小的業(yè)務包即可;
2、自己其它項目的依賴如何處理?
我們在做項目開發(fā)時,除了會引用第三方依賴,也會依賴自己公司的其它模塊。
比如

這種依賴自己其它項目的工程,也是會經(jīng)常變動的,所以不宜打到外部的lib,不然就會需要經(jīng)常上傳更新。
那怎么做了?
其實也很簡單 只需在上面的插件把你需要打進jar的填寫進去就可以了
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<layout>ZIP</layout>
<!--這里是填寫需要包含進去的jar,如果沒有則nothing -->
<includes>
<include>
<groupId>com.jincou</groupId>
<artifactId>xiaoxiao-util</artifactId>
</include>
</includes>
</configuration>
</plugin>這樣只有include中所有添加依賴依然會打進當前業(yè)務包中。
四、總結(jié)
使用瘦身部署,你的業(yè)務包確實小了 方便每次的迭代更新,不用每次都上傳一個很大的 jar 包,從而節(jié)省部署時間。
但這種方式也有一個弊端就是增加了Jar包的管理成本,多人協(xié)調(diào)開發(fā),構(gòu)建的時候,還需要專門去關(guān)注是否有人更新依賴。
以上就是詳解如何給SpringBoot部署的jar包瘦身的詳細內(nèi)容,更多關(guān)于SpringBoot jar包瘦身的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java獲取接口的所有實現(xiàn)類方法總結(jié)示例
這篇文章主要給大家介紹了關(guān)于Java獲取接口的所有實現(xiàn)類方法的相關(guān)資料,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-06-06
SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫
這篇文章主要介紹了SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫密碼加密的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
druid監(jiān)控無法關(guān)閉的坑以及處理方式
這篇文章主要介紹了druid監(jiān)控無法關(guān)閉的坑以及處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot中IP白名單控制實現(xiàn)限制接口訪問
IP白名單是一種網(wǎng)絡(luò)安全機制,通過預設(shè)允許訪問的IP地址列表實現(xiàn)對請求來源的精確控制,在Spring Boot中實現(xiàn)IP白名單有多種技術(shù)方案,下面就拉介紹一下,感興趣的可以了解一下2025-07-07

