Maven - Spring Boot 項目打包本地 jar 的 3 種方法

文章目錄

  • Pre
  • 概述
  • 方案思路
  • 構建流程圖
  • 工作機制說明
  • 目錄結構示例
  • POM 配置模板
  • 構建與驗證
  • 注意事項
  • 方案優缺點

在這里插入圖片描述


Pre

Maven - Manual Maven JAR Installation:用 mvn install:install-file 安裝本地 JAR 的實用指南

概述

在 Spring Boot 項目中,通常依賴包會從 Maven 中央倉庫或私有倉庫獲取,并由 spring-boot-maven-plugin 自動打包進最終的可執行 fat jar(BOOT-INF/lib 目錄)。
但在實際開發中,有時會遇到無法從公共或私有倉庫獲取的第三方 jar,例如廠商提供的 SDK、本地編譯生成的工具包、未開源的內部依賴等。

如果直接使用 <scope>system</scope> 引入本地 jar,雖然能在編譯時解析,但 Maven 默認不會將 system scope 依賴打入 Spring Boot 的 fat jar 中,導致部署后運行時找不到該類。

為了解決這一問題,需要在打包階段顯式將這些 jar 文件復制到 BOOT-INF/lib 目錄,確保它們隨 Spring Boot 應用一起分發與運行。

這個場景尤其適用于:

  • 快速集成:臨時引入無法上傳至私服的第三方 jar。
  • 離線部署:運行環境無法訪問外部倉庫。
  • 封閉式交付:需要將全部依賴打包成一個獨立可運行的 jar 文件。

方案思路

  1. 編譯期:使用 <scope>system</scope> 讓本地 jar 參與編譯。
  2. 打包期:通過 maven-resources-pluginprocess-resources 階段將本地 jar 文件復制到 target/classes/BOOT-INF/lib,這樣 spring-boot-maven-pluginrepackage 時會將其一并打入 fat jar。
  3. 運行期:由于 jar 已進入 BOOT-INF/lib,Spring Boot 的類加載器會自動加載。

構建流程圖

本地 jar 放到 src/main/resources/lib
執行 mvn package
maven-resources-plugin 在 process-resources 階段執行
復制 *.jar 到 target/classes/BOOT-INF/lib
Spring Boot repackage 階段啟動
收集 BOOT-INF/lib 內的 jar
生成可執行 fat jar
部署并運行
Spring Boot 類加載器加載 BOOT-INF/lib 中的 jar

工作機制說明

  1. 資源復制階段
    maven-resources-pluginprocess-resources 階段,將 src/main/resources/lib 中的所有 jar 文件復制到 target/classes/BOOT-INF/lib
  2. 打包階段
    spring-boot-maven-pluginrepackage 階段會打包所有在 BOOT-INF/lib 的 jar 到最終可執行 jar 中。
  3. 運行階段
    Spring Boot 啟動時會用自帶的類加載器加載 BOOT-INF/lib 中的所有 jar,使它們在運行時可用。

目錄結構示例

my-project/
├── src/
│   ├── main/
│   │   ├── java/...         # 源碼
│   │   ├── resources/
│   │   │   ├── application.yml
│   │   │   └── lib/
│   │   │       └── your.jar  # 本地 jar
├── pom.xml

POM 配置模板

<dependency><groupId>com.xxx</groupId><artifactId>your-artifact</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/your.jar</systemPath>
</dependency><build><plugins><!-- 復制本地 jar 到 BOOT-INF/lib --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.3.0</version><executions><execution><id>copy-system-jars</id><phase>process-resources</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>${project.build.outputDirectory}/BOOT-INF/lib</outputDirectory><resources><resource><directory>${project.basedir}/src/main/resources/lib</directory><includes><include>*.jar</include></includes></resource></resources></configuration></execution></executions></plugin><!-- Spring Boot 打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins>
</build>

構建與驗證

mvn clean package

驗證 jar 是否被打入:

jar tf target/my-project-0.0.1-SNAPSHOT.jar | grep BOOT-INF/lib

應能看到 your.jar 記錄。


注意事項

  • system scope 在 Maven 官方中不推薦長期使用,不具備依賴沖突檢測功能,適合臨時方案。

  • 如果 jar 需要長期維護,建議安裝到本地倉庫:

    mvn install:install-file \-Dfile=src/main/resources/lib/your.jar \-DgroupId=com.xxx \-DartifactId=your-artifact \-Dversion=1.0.0 \-Dpackaging=jar
    
  • 團隊協作建議使用私服(Nexus / Artifactory)管理。


方案優缺點

方法核心做法是否自動打包進 fat jar優點缺點適用場景
方法 1:安裝到本地 Maven 倉庫mvn install:install-file 安裝到 ~/.m2/repository,pom.xml 正常依賴? 會打包- 符合 Maven 規范
- 支持版本管理與沖突檢測
- CI/CD 無障礙
- 初次使用需執行安裝命令
- jar 更新需重新安裝
jar 可長期使用,且團隊或構建環境可訪問本地/遠程倉庫
方法 2:上傳到私服(Nexus/Artifactory)上傳 jar 到私服倉庫,pom.xml 正常依賴? 會打包- 團隊共享方便
- 支持版本管理與依賴分析
- CI/CD 最友好
- 需要搭建和維護私服
- 上傳步驟比本地倉庫多
多人協作項目,需穩定依賴和自動化構建
方法 3:直接內嵌 jar(system scope)把 jar 放到 src/main/resources/lib<scope>system</scope>? 默認不會打包(可用 includeSystemScope=true 或 maven-resources-plugin 手動復制)- 無需上傳倉庫
- 依賴文件隨項目走
- 不走 Maven 依賴管理
- 無版本沖突檢測
- CI/CD 需額外處理
- jar 升級需手動替換
臨時測試或快速 PoC,構建環境固定且可直接帶 jar

方法是否打包進 fat jar優點缺點適用場景
本方案(system + 手動復制)?快速接入,適合臨時調試或離線部署維護成本高,不做依賴沖突檢測臨時/封閉環境
本地 Maven 倉庫安裝?符合 Maven 規范,支持版本管理jar 更新需重新安裝長期使用,本地構建
上傳私服?團隊共享方便,CI/CD 友好需搭建和維護私服多人協作,長期依賴

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平替 Claude Code,API接入 GPT-5,Codex CLI 國內直接使用教程

最新升級接入GPT-5的 Codex 擁有可以媲美 Claude Code 的AI編碼能力&#xff0c;本文將指導你在 Windows系統上部署原生的 Codex CLI程序&#xff0c;并且接入超低價中轉API&#xff0c;讓你在國內直接用上超高性價比的 OpenAI Codex CLI 應用。關于 CodexCodex 是 OpenAI 開發…

kubernertes (K8S)部署

參考&#xff1a; https://blog.csdn.net/yu33575/article/details/135387548 二進制安裝k8s&#xff1a; https://blog.csdn.net/qq_73990369/article/details/143217084 K8S二進制安裝與部署 &#xff1a;https://blog.csdn.net/fantuan_sss/article/details/139073366 k8s…

LeetCode 簡單JS刷題

目錄 返回數組最后一個元素 2787.將一個數字表示成冪的和的方案數 326.3的冪 1780.判斷一個數字是否可以表示成三的冪的和 342.4的冪 返回數組最后一個元素 1.請你編寫一段代碼實現一個數組方法&#xff0c;使任何數組都可以調用 array.last() 方法&#xff0c;這個方法將…

七大排序算法全解析:從入門到精通

目錄 一.排序的概念 二.常見排序算法的實現 2.1 插入排序 &#xff08;1&#xff09;直接插入排序&#xff1a; 當插入第i(i>1)個元素時&#xff0c;前面的array[0],array[1],…,array[i-1]已經排好序&#xff0c;此時用array[i]的排序碼與array[i-1],array[i-2],…的排序…

20250814在榮品RD-RK3588開發板的Android13下解決卡迪的LCD屏在開機的時候brightness最暗【背光的pwm信號的極性反了】

20250814在榮品RD-RK3588開發板的Android13下解決卡迪的LCD屏在開機的時候brightness最暗【背光的pwm信號的極性反了】 2025/8/14 11:33緣起&#xff1a;在榮品RD-RK3588開發板的Android13下&#xff0c;卡迪的LCD屏在開機的時候很暗&#xff0c;幾乎看不見。 在命令行查看亮度…

Flink的狀態管理

一、狀態的概念Flink的狀態其實你就可以將其想象為中間結果就可以了。在Flink中&#xff0c;算子的任務可以分為無狀態和有狀態兩種情況。無狀態算子任務在計算過程中是不依賴于其他數據的&#xff0c;只根據當前的輸入數據就可以得到結果輸出。比如之前講到的Map、FlatMap、Fi…

GoLand 項目從 0 到 1:第八天 ——GORM 命名策略陷阱與 Go 項目啟動慢問題攻堅

第八天核心任務&#xff1a;解決開發中的兩大技術卡點今天的開發不僅聚焦于代碼層面的數據庫字段映射問題&#xff0c;還遭遇了一個困擾團隊許久的環境難題 ——Go 項目啟動異常緩慢。經過多維度排查&#xff0c;我們不僅理清了 GORM 命名策略的設計邏輯&#xff0c;還找到了影…

在Ubuntu上安裝Google Chrome的詳細教程

步驟 1&#xff1a;下載 Google Chrome 安裝包 打開瀏覽器輸入https://www.google.cn/chrome/&#xff0c;然后進入Chrome瀏覽器官方網站 點擊下載選擇Debian/Ubuntu版本 google-chrome-stable_current_amd64.deb步驟 2&#xff1a;安裝下載的.deb 包 sudo dpkg -i google-chro…

el-table合并相同名稱的行

el-table合并相同名稱的行 <template><el-table:data"tableData":span-method"objectSpanMethod"border><el-table-columnprop"name"label"名稱"width"180"></el-table-column><el-table-column…

解決 VSCode 無法從右鍵菜單“通過 Code 打開”文件夾的問題

&#x1f9e9; 一、問題現象 VSCode 已安裝&#xff0c;但右鍵文件夾/桌面空白處無“通過 Code 打開在 VSCode 中執行 Shell Command: Install ‘Open with Code’ 無反應手動添加后菜單顯示亂碼&#xff08;如 €?? Code ‰“€&#xff09;點擊右鍵菜單無響應或提示“找不到…

服務器數據恢復—服務器硬盤狀態燈變紅,分區數據恢復過程

服務器數據恢復環境&故障&#xff1a; 某公司服務器上有一組由3塊硬盤組建的raid5磁盤陣列。 服務器上1塊硬盤的狀態燈變為紅色&#xff0c;磁盤陣列出現故障&#xff0c;分區無法識別。服務器數據恢復過程&#xff1a; 1、將故障服務器上所有磁盤編號后取出。經過初檢&…

MySQL → SQL → DDL → 表操作 → 數據類型 知識鏈整理成一份系統的內容

1. 知識結構MySQL└── SQL&#xff08;結構化查詢語言&#xff09;├── DDL&#xff08;數據定義語言&#xff09; → 定義結構│ ├── 表操作&#xff08;創建/修改/刪除表&#xff09;│ └── 數據類型&#xff08;列字段類型定義&#xff09;├── DML&…

基于 gRPC 的接口設計、性能優化與生產實踐

gRPC 是一種高性能、跨語言的遠程過程調用&#xff08;RPC&#xff09;框架&#xff0c;由 Google 開發&#xff0c;基于 HTTP/2 協議和 Protocol Buffers&#xff08;Protobuf&#xff09;序列化機制&#xff0c;廣泛應用于微服務架構和分布式系統中。本文將深入解析 gRPC 的底…

如何回答研究過MQ的源碼嗎

?一、核心回答框架&#xff08;由淺入深&#xff09;??1?? ?明確研究對象和深度?“我主要研究過 ??[具體MQ名稱&#xff0c;如RocketMQ/Kafka/RabbitMQ]?? 的核心模塊源碼&#xff0c;重點關注 ??[選1-2個核心方向]?? &#xff0c;比如存儲機制、網絡通信或事務…

20250815給ubuntu22.04.5的系統縮小/home分區

20250815給ubuntu22.04.5的系統縮小/home分區 2025/8/15 9:42緣起&#xff0c;聯想IdeaPad筆記本電腦&#xff0c;換了4TB的SSD固態硬盤。 WIN10和ubuntu22.04.5的雙系統。 WIN10系統&#xff1a; C盤 500GB&#xff1f; D盤 500GB&#xff1f;ubuntu22.04.5 /home分區大概 2.7…

Windows 11 首次開機引導(OOBE 階段)跳過登錄微軟賬戶,創建本地賬戶

今天重裝WIN11系統后&#xff0c;發現在首次開機引導&#xff08;OOBE 階段&#xff09;中&#xff0c;微軟默認強制聯網并登錄微軟賬戶&#xff0c;沒有的讓你注冊什么的就很煩。通過下面方法可以跳過登錄微軟賬戶&#xff0c;直接創建本地賬戶。? 方法一&#xff1a;斷網&am…

IDE:vscode的vue3模板

快捷鍵打開配置選項&#xff1a;ctrl shift p選擇配置文件&#xff1a;Snippet: Configure Snippets{// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and // description. The prefix is what is used to trigg…

C++_390_透傳功能中,使用單例模式,管理session透傳會話的生命周期,為每個會話記錄報警讀取狀態,監控會話心跳狀態,后臺線程自動清理超時會話

問題:對接板端,cvms lite 通道管理頁面,無法添加和刪除多目通道 審核:XXX 根因分析:多通道的刪除和添加需要通過eventcheck上告實現,cvms lite云走的透傳沒有eventcheck 解決辦法:云透傳加上eventcheck上告 footer: Closes: #BUG2025052701632 我幫你分兩部分解析:先解…

MIPI-csi調試

調試流程1. 硬件連線檢查數據線&#xff08;MIPI Data Lanes&#xff09; &#xff1a;確認 IMX415 模組的 4 條數據線 1 條時鐘線連接正確。如果是 4-lane 輸出&#xff0c;SoC 的 D-PHY 必須也配置成 4-lane 接收。控制線&#xff1a;原理圖IC SDA/SCL → &i2c8 控制器管…

Mysql——》提取JSON對象和數組

推薦鏈接&#xff1a; 總結——》【Java】 總結——》【Mysql】 總結——》【Redis】 總結——》【Kafka】 總結——》【Spring】 總結——》【SpringBoot】 總結——》【MyBatis、MyBatis-Plus】 總結——》【Linux】 總結——》【MongoD…