微服務中使用Maven BOM來管理你的版本依賴

摘要: 原創出處 sf.gg/a/1190000021198564 「飄渺Jam」歡迎轉載,保留摘要,謝謝!

  1. 為什么要使用BOM?

  2. 如何定義BOM?

  3. 項目使用方法?

BOM(Bill of Materials)是由Maven提供的功能,它通過定義一整套相互兼容的jar包版本集合,使用時只需要依賴該BOM文件,即可放心的使用需要的依賴jar包,且無需再指定版本號。BOM的維護方負責版本升級,并保證BOM中定義的jar包版本之間的兼容性。

為什么要使用BOM

使用BOM除了可以方便使用者在聲明依賴的客戶端時不需要指定版本號外,最主要的原因是可以解決依賴沖突,如考慮以下的依賴場景:

項目A依賴項目B 2.1和項目C 1.2版本:

項目B 2.1依賴項目D 1.1版本;

項目C 1.2依賴項目D 1.3版本;

在該例中,項目A對于項目D的依賴就會出現沖突,按照maven dependency mediation的規則,最后生效的可能是:項目A中會依賴到項目D1.1版本(就近原則,取決于路徑和依賴的先后,和Maven版本有關系)。

在這種情況下,由于項目C依賴1.3版本的項目D,但是在運行時生效的確是1.1版本,所以在運行時很容易產生問題,如 NoSuchMethodError, ClassNotFoundException等。

如何定義BOM
BOM本質上是一個普通的POM文件,區別是對于使用方而言,生效的只有這一個部分。只需要在定義對外發布的客戶端版本即可:

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>com.ydj.qd</groupId>
<artifactId>inf-bom</artifactId>
<version>1.0</version>
<packaging>pom</packaging><name>inf-bom</name>
<description>第三方jar包統一管理</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring.version>4.3.15.RELEASE</spring.version>
</properties><dependencyManagement><dependencies><!-- 阿里 --><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!-- https://mvnrepository.com/artifact/com.aliyun.mns/aliyun-sdk-mns --><dependency><groupId>com.aliyun.mns</groupId><artifactId>aliyun-sdk-mns</artifactId><version>1.1.8</version><classifier>jar-with-dependencies</classifier></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.29</version></dependency><!-- Apache --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.1</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.1</version></dependency><!-- 谷歌 --><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.0.1-jre</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency><!-- 常用工具 --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.7</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.14.4</version></dependency></dependencies>
</dependencyManagement><build>
</build><distributionManagement><repository><id>maven-releases</id><name>maven-releases</name><url>http://mvn.ydj.com/repository/maven-releases/</url></repository><snapshotRepository><id>maven-snapshots</id><name>maven-snapshots</name><url>http://mvn.ydj.com/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>
項目使用方法 在你的項目主pom.xml文件中節點下首位處加入如下: com.jlcx.qd inf-bom ${version} pom import
      <dependency>...</dependency>
</dependencies>
在需要使用相關JAR包的pom.xml文件中節點下引入如下: ... com.google.guava guava
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId>
</dependency>
....
如果需要使用不同于當前bom中所維護的jar包版本,則加上覆蓋即可,如: ... com.google.guava guava
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version>
</dependency>
....

WX 搜索《醉魚Java》,回復面試,獲取2024面試資料。

如果這篇文章對您有所幫助或者啟發,幫忙點個關注叭,您的支持是我堅持寫作的最大動力。

求一鍵三連:點贊、轉發、在看。

謝謝支持喲 !

在這里插入圖片描述

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

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

相關文章

通過 NIO + 多線程 提升硬件設備與系統的數據傳輸性能

一、項目展示 下圖&#xff08;模擬的數據可視化大屏&#xff09;中數據是動態顯示的 二、項目簡介 描述&#xff1a;使用Client模擬了硬件設備&#xff0c;比如可燃氣體濃度檢測器。Client通過Socket與Server建立連接&#xff0c;Server保存數據到txt文件&#xff0c;并使用W…

結構體(位段)內存分配

結構體由多個數據類型的成員組成。那編譯器分配的內存是不是所有成員的字節數總和呢&#xff1f; 首先&#xff0c;stu的內存大小并不為29個字節&#xff0c;即證明結構體內存不是所有成員的字節數和。 ??其次&#xff0c;stu成員中sex的內存位置不在21&#xff0c;即可推測…

Swift 請求用戶授權以跟蹤其跨應用或網站的活動

步驟1:導入框架 首先,需要在Swift文件中導入AppTrackingTransparency框架。 import AppTrackingTransparency import AdSupport步驟2:請求跟蹤許可 在適當的地方請求用戶的跟蹤許可。通常,這個請求會在應用啟動時或者在用戶執行某些操作(例如,訪問應用中的廣告相關功能…

Linux服務器安裝docker,基于Linux(openEuler、CentOS8)

本實驗環境為openEuler系統(以server方式安裝)&#xff08;CentOS8基本一致&#xff0c;可參考本文) 目錄 知識點實驗 知識點 Docker 是一個開源的應用容器引擎。它允許開發者將應用及其所有依賴項打包到一個可移植的容器中&#xff0c;并發布到任何支持Docker的流行Linux或Wi…

基于python flask的web服務

基本例子 from flask import Flask app Flask(__name__) app.route(/)#檢查訪問的網址&#xff0c;根路徑走這里 def hello_world():return hello world#返回hello worldif __name__ __main__:# 綁定到指定的IP地址和端口app.run(host0.0.0.0, port1000, debugTrue)##綁定端…

設計一個完美的用戶角色權限表

設計一個完美的用戶角色權限表需要考慮系統的安全性、靈活性和可擴展性。以下是一個詳細的用戶角色權限管理表設計方案&#xff0c;包含多個表結構和字段描述。 目錄 1. 用戶表&#xff08;Users Table&#xff09;2. 角色表&#xff08;Roles Table&#xff09;3. 權限表&…

【數據結構與算法 | 基礎篇】環形數組模擬隊列

1. 前言 上文我們用環形單向鏈表實現了隊列.接下來我們用環形數組來模擬隊列.并實現了isFull()&#xff0c;isEmpty()等方法. 2. 環形數組模擬隊列 (1). Queue接口 : public interface Queue<E> {//向隊伍插入值, 插入成功返回true, 否則返回falseboolean offer(E v…

【Linux】TCP協議【上】{協議段屬性:源端口號/目的端口號/序號/確認序號/窗口大小/緊急指針/標記位}

文章目錄 1.引入2.協議段格式4位首部長度16位窗口大小32位序號思考三個問題【demo】標記位URG: 緊急指針是否有效提升某報文被處理優先級【0表示不設置1表示設置】ACK: 確認號是否有效PSH: 提示接收端應用程序立刻從TCP緩沖區把數據讀走RST: 對方要求重新建立連接; 我們把攜帶R…

windows 設置系統字體 (win11 win10)

由于微軟的字體是有版權的&#xff0c;所以我打算替換掉 1.下載替換工具 github的項目&#xff0c;看起來很多人對微軟默認字體帶版權深惡痛絕。 項目地址&#xff1a;nomeiryoUi地址 這里選取最新的版本即可 2.打開軟件 這里顯示標題欄不能改&#xff0c;確認&#xff0c;其…

蓋雅技能發展云,助力制造企業人效合一

制造行業盡管經歷多次變革&#xff0c;但企業對人的管理始終是一項高度依賴經驗和耗費人力的工作。隨著供應鏈管理和生產設備的自動化、數字化升級&#xff0c;如何將第一生產要素——人&#xff0c;通過數字化的工具融入制造過程的閉環&#xff0c;對企業實現自動化工廠和智能…

力扣 滑動窗口題目總結

Leetcode3.無重復字符的最長子串 思路&#xff1a; 這道題主要用到思路是&#xff1a;滑動窗口 什么是滑動窗口&#xff1f; 其實就是一個隊列,比如例題中的 abcabcbb&#xff0c;進入這個隊列&#xff08;窗口&#xff09;為 abc 滿足題目要求&#xff0c;當再進入 a&#x…

牛客NC334 字典序第K小【困難 10叉樹 Java/Go/PHP/C++】,力扣 440. 字典序的第K小數字

題目 題目鏈接&#xff1a; https://www.nowcoder.com/practice/670c2bda374241d7ae06ade60de33e8b https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/description/ 本答案核心 10叉樹, 數學規律Java代碼 import java.util.*;public class Solution {…

大模型的靈魂解讀:Anthropic AI的Claude3 Sonnet可解釋性研究

大模型技術論文不斷&#xff0c;每個月總會新增上千篇。本專欄精選論文重點解讀&#xff0c;主題還是圍繞著行業實踐和工程量產。若在某個環節出現卡點&#xff0c;可以回到大模型必備腔調重新閱讀。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;則提供了大模型領域最新技…

Vue集成Iframe

一、應用場景&#xff0c;為什么要集成Iframe&#xff1f; 1、龐大項目拆分后&#xff0c;便于管理和部署&#xff0c;用集成Iframe的方法合并 2、避免功能重復開發&#xff0c;共用模塊可單獨開發為一個項目&#xff0c;既可獨立部署&#xff0c;也可集成到中臺系統 二、集成…

[算法][前綴和] [leetcode]724. 尋找數組的中心下標

題目地址 https://leetcode.cn/problems/find-pivot-index/description/ 題目描述 代碼 class Solution {public int pivotIndex(int[] nums) {int total Arrays.stream(nums).sum();//前綴和int prefixSum 0;int len nums.length;for(int i 0;i<len;i){if (i-1>0){p…

小豬APP分發:一站式托管服務,輕松玩轉應用市場

在當今移動應用爆炸式增長的時代&#xff0c;開發者們面臨的挑戰不再僅限于創意的火花和代碼的實現&#xff0c;更在于如何讓精心打造的應用快速觸達廣大用戶。這正是小豬APP分發www.appzhu.net應運而生的背景——作為一個全面、高效的APP托管服務分發平臺&#xff0c;它為開發…

基于PHP的物業管理的設計與實現

第1章 緒論... 1 1.1 研究背景與意義... 1 1.2 國內外發展現狀... 2 第2章 關鍵技術介紹... 3 2.1 PHP語言... 3 2.2 MySQL數據庫... 3 2.3 Zend框架... 4 2.4 B/S架構... 4 第3章 系統需求分析... 5 3.1 可行性分析... 5 3.1.1 技術可行性分析... 5 3.1.2 經濟可行…

解決Java中的IllegalArgumentException異常的正確方法

解決Java中的IllegalArgumentException異常的正確方法 引言 在Java編程中&#xff0c;IllegalArgumentException是一個常見的運行時異常&#xff0c;它通常在方法接收到不合法或不適當的參數時拋出。這篇文章將詳細介紹IllegalArgumentException異常的原因、如何診斷以及解決…

金職優學:分析央國企面試如何通關?

在當今競爭激烈的就業市場中&#xff0c;中央和國有企業&#xff08;以下簡稱“央國企”&#xff09;的面試機會對求職者來說是非常有吸引力的。這些企業通常擁有穩定的發展前景、良好的薪酬福利和廣闊的職業發展空間。但是&#xff0c;要想成功通過央國企的面試&#xff0c;求…

探索Python編程世界:從基礎到實戰

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、Python語言簡介與動態特性 代碼示例&#xff1a;動態類型與變量命名 二、Python應用領…