「告別臃腫!」SpringBoot Jar 文件瘦身全攻略,讓部署快如閃電!
在持續交付的時代里,Spring Boot 項目往往以 “一鍵打包、即刻部署” 的特性受到青睞。然而,隨著業務功能的擴展與依賴庫的增加,最終生成的 Jar 文件(俗稱 “胖 Jar”)常常變得龐大無比——不僅拖慢上傳與傳輸速度,還占據大量磁盤空間,對容器鏡像體積也造成直接影響。 為了讓部署“輕裝上陣”,本文將帶你系統掌握 Spring Boot Jar 文件瘦身的完整方案,通過 Maven 插件 進行結構分離與依賴外置化處理,讓部署更高效、更可控。
核心理念:讓 Jar 更輕、更快
Spring Boot 默認會將項目代碼與所有依賴(如 Spring Core、MyBatis、數據庫驅動等)一并打入同一個可執行 Jar 包中,形成一個“大一統”的胖 Jar。 而瘦身優化的本質,就是 將第三方依賴從主 Jar 拆分出來,獨立存放到 /lib 目錄中,讓主 Jar 只保留:
- 自身業務邏輯與配置文件
- 啟動引導類(Spring Boot Loader)
這樣一來,部署時只需上傳體積小得多的主 Jar,外部依賴無需重復傳輸。 典型的優化效果是:Jar 從 80MB 縮減至 8MB 左右,部署效率提升 10 倍以上。
項目結構與包命名規范
假設項目路徑遵循 Linux 風格結構:
/usr/local/java/
└── springboot-slim-demo/
├── src/
├── pom.xml
└── target/
├── demo-service.jar
└── lib/
├── spring-core-5.2.5.RELEASE.jar
├── mybatis-3.5.4.jar
└── ...項目包名統一規范為:
com.icoderoad.springboot.slim實戰配置:基于 Maven 插件實現瘦身
以下是優化版的 pom.xml 關鍵片段。 通過兩個 Maven 插件配合使用,實現 Jar 文件結構的徹底瘦身:
<build>
<plugins>
<!-- 插件1:拷貝依賴到獨立 lib 目錄 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<!-- 綁定到 package 階段 -->
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 輸出目錄 -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 包含所有直接與間接依賴 -->
<excludeTransitive>false</excludeTransitive>
<!-- 保留版本號便于調試 -->
<stripVersion>false</stripVersion>
<!-- 減少日志輸出 -->
<silent>true</silent>
<!-- 可選:排除項目內部依賴 -->
<!-- <excludeGroupIds>com.icoderoad</excludeGroupIds> -->
</configuration>
</execution>
</executions>
</plugin>
<!-- 插件2:生成瘦身后的 Spring Boot 主 Jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
<configuration>
<!-- 建議開啟 fork 模式支持 devtools -->
<fork>true</fork>
<!-- 支持 systemScope 依賴 -->
<includeSystemScope>true</includeSystemScope>
<!-- 核心:僅保留 Loader 啟動器 -->
<includes>
<include>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
</include>
<!-- 可選:保留自定義內部依賴 -->
<!--
<include>
<groupId>com.icoderoad</groupId>
</include>
-->
</includes>
<!-- 使用 ZIP 格式,支持外部 lib 加載 -->
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- 輸出主 Jar 文件名 -->
<finalName>${project.artifactId}</finalName>
</build>插件配置詳解
maven-dependency-plugin
該插件在執行 mvn package 時自動運行,將所有依賴復制到 target/lib 目錄。 主要參數說明:
參數 | 說明 |
| 綁定打包階段自動執行 |
| 指定依賴輸出路徑(默認 target/lib) |
| 包含傳遞依賴,確保完整性 |
| 保留版本號,方便排查依賴沖突 |
spring-boot-maven-plugin
此插件是 Spring Boot 的核心打包工具,通過 <includes> 與 <layout> 控制打包邏輯。
spring-boot-loader必須保留 它是啟動核心類,負責從外部lib目錄加載依賴。layout=ZIP選擇 ZIP 格式意味著啟用PropertiesLauncher啟動器,可動態指定依賴路徑。fork=true保證開發階段熱部署生效。
瘦身效果驗證
執行以下命令進行打包:
mvn clean package生成結果如下:
target/
├── demo-service.jar # 主 Jar(僅幾 MB)
└── lib/ # 外部依賴(幾十 MB)對比優化前后:
類型 | 優化前 | 優化后 | 減少比例 |
主 Jar | 85 MB | 8 MB | 約 90% |
總部署包 | 85 MB | 48 MB(一次性) | - |
后續更新只需替換主 Jar,依賴部分保持不變,CI/CD 發布時間可從數分鐘降至數秒。
部署方式
將打包結果上傳至服務器目錄 /opt/app/:
/opt/app/
├── demo-service.jar
└── lib/
├── spring-core-5.2.5.RELEASE.jar
├── mybatis-3.5.4.jar
└── ...啟動命令如下:
java -Dloader.path=./lib -jar demo-service.jar后臺運行示例:
nohup java -Dloader.path=./lib -jar demo-service.jar > app.log 2>&1 &參數說明:
-Dloader.path=./lib:指定外部依賴路徑-jar demo-service.jar:啟動主 Jar 文件
常見問題與優化建議
問題 | 原因 | 解決方案 |
啟動時報 | 未正確指定 | 檢查路徑及 |
拷貝依賴不完整 |
| 修改為 false 并重新打包 |
| 未開啟 fork 模式 | 設置 |
進階技巧:本地自定義依賴
若項目依賴了非 Maven 管理的 Jar 文件,可手動引入:
<dependency>
<groupId>com.custom</groupId>
<artifactId>custom-sdk</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/custom-sdk-1.0.0.jar</systemPath>
</dependency>并確保 spring-boot-maven-plugin 中啟用了:
<includeSystemScope>true</includeSystemScope>結語:讓每次部署都更輕盈
Spring Boot 的 Jar 瘦身方案,通過 “依賴分離 + 外部加載” 的設計理念,讓項目從臃腫走向精簡。 核心要點:
- 使用
maven-dependency-plugin將依賴統一抽離至/lib; - 通過
spring-boot-maven-plugin僅保留啟動器并采用 ZIP 格式打包; - 啟動時用
-Dloader.path指定外部依賴路徑。
該方案不僅能讓部署文件體積驟減,還能加快 CI/CD 構建效率,非常適合微服務架構與容器化環境。 未來,你的每一次發布,都能像“閃電”一樣迅捷!



























