maven optional 功能詳解

前言

最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動.

后來隨著項目的深入.引入的jar包變多.發現

jar包太多,編譯太慢,
打包之后的war包非常大.

這種情況就可以使用optional來優化

什么是optional

optional是maven依賴jar時的一個選項,表示該依賴是可選的.不會被依賴傳遞

<optional>true</optional>

使用場景

以項目中使用到的日志框架為例.

例如

B 依賴了日志框架 logbacklog4japache commons log
這時候的依賴關系如下 A-> B (A依賴B)
因為maven有依賴傳遞機制.那么A項目就會有3個jar包,logbacklog4japache commons log.實際上我們一般只會在項目中使用一種日志框架.那么我們項目中就會有多余的依賴.當這種情況時越來越多時,最后整個項目的jar包就有很多的多余依賴,導致項目很臃腫.

如何優化
只要B項目中把logback、log4japache commons log設置成<optional>true</optional>

例如
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><optional>true</optional>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><optional>true</optional>
</dependency>

這時候A項目依賴B的時候,項目中不會有logbacklog4japache commons log jar包,可以根據情況自行選擇一個即可.

總結

當你開發的組件時,有一個功能,有多種實現方式的jar可以提供,但是實際只會使用一種的情況下.可以把實現的jar包設置成<optional>true</optional>.表示: 瞧,你依賴我時,用到這個功能時,可以自行選擇.而不是默認全部都給你.管你用不用.

為什么要使用optional

減少不必要的依賴傳遞
減少jar包沖突

原理

引入了optional實際上默認會做排除操作

It may be helpful to think of optional dependencies as "excluded by default
參考資料

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

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

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

相關文章

Python基礎--Day04--流程控制語句

流程控制語句是計算機編程中用于控制程序執行流程的語句。它們允許根據條件來控制代碼的執行順序和邏輯&#xff0c;從而使程序能夠根據不同的情況做出不同的決策。流程控制實現了更復雜和靈活的編程邏輯。 順序語句 順序語句是按照編寫的順序依次執行程序中的代碼。代碼會按照…

【同濟大學】雙速率自動駕駛架構LeAD:端到端+LLM,CARLA實測93%路線完成率,性能SOTA!

近年來&#xff0c;隨著端到端的技術快速發展將自動駕駛帶到了一個新高度&#xff0c;并且取得了非常亮眼的成績。由于感知限制和極端長尾場景下訓練數據覆蓋不足&#xff0c;模型在高密度復雜交通場景下和不規則交通情況下的處理能力不足&#xff0c;導致在開放道路上大規模部…

github與git新手教程(快速訪問github)

0 序言 作為一個開發者&#xff0c;你必須知道github和git是什么&#xff0c;怎么使用。 github是一個存儲代碼等資源的遠程倉庫&#xff0c;一個大型項目往往需要很多人共同協作開發&#xff0c;而大家如何協同開發的進度與分工等要求需要有一個統一開放保存代碼的平臺。git…

Windows環境下安裝Python和PyCharm

可以只安裝PyCharm嗎&#xff1f;不可以&#xff01;&#xff01;&#xff01; 開發Python應用程序需要同時安裝Python和PyCharm。Python是一種編程語言&#xff0c;PyCharm是一個專門為Python開發設計的集成開發環境&#xff0c;提供豐富的功能以簡化編碼過程。 一、前期準備…

Qt 嵌入式系統資源管理

在嵌入式系統中&#xff0c;資源&#xff08;CPU、內存、存儲、網絡等&#xff09;通常非常有限&#xff0c;因此高效的資源管理對 Qt 應用的穩定性和性能至關重要。本文從內存優化、CPU 調度、存儲管理到電源控制&#xff0c;全面解析 Qt 嵌入式系統資源管理的關鍵技術。 一、…

小杰數據結構(one day)——心若安,便是晴天;心若亂,便是陰天。

1.數據結構計算機存儲、組織數據的方式&#xff1b;有特定關系的數據元素集合&#xff1b;研究數據的邏輯結構、物理結構&#xff08;真實存在&#xff09;和對應的算法&#xff1b;新結構仍保持原結構類型&#xff1b;選擇更高的運行或存儲效率的數據結構。邏輯結構——面向問…

力扣面試150(44/150)

7.30 155. 最小棧 設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂…

Linux實戰:從零搭建基于LNMP+NFS+DNS的WordPress博客系統

前言 在數字化時代&#xff0c;擁有一個個人博客是技術愛好者展示成果、分享經驗的重要方式。本文將帶您從零開始&#xff0c;在Linux環境下通過兩臺服務器協作&#xff0c;搭建一個功能完整的WordPress博客系統。我們將整合LNMP架構、NFS文件共享和DNS域名解析服務&#xff0c…

Apache Ignite 的對等類加載(Peer Class Loading, P2P Class Loading)機制

這段內容是關于 Apache Ignite 的“對等類加載”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;機制的詳細說明。這是 Ignite 為了簡化開發而設計的一個非常強大的功能&#xff0c;但同時也存在一些安全和性能上的考量。 下面我將用通俗易懂的語言 結構化解…

預過濾環境光貼圖制作教程:第四階段 - Lambert 無權重預過濾(Stage 3)

在完成高光反射的 GGX 預過濾后,我們還需要處理環境光的漫反射部分。本階段(Stage 3)將基于 Lambert 分布對環境貼圖進行無權重預過濾,生成用于漫反射計算的環境數據。與高光反射的方向性不同,漫反射是光線在粗糙表面的均勻散射,因此需要用更適合均勻分布的 Lambert 模型…

Spring與SpringBoot:從手動擋到自動擋的Java開發進化論

大家好&#xff01;我是程序員良辰&#xff0c;今天我們來聊聊Java開發界的兩位"重量級選手"&#xff1a;Spring 和 SpringBoot。它們之間的關系就像手動擋汽車和自動擋汽車——一個給你完全的控制權但操作復雜&#xff0c;一個讓你輕松上路但保留了切換手動模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常見和推薦的做法。將復雜的邏輯封裝在 methods 中。<!-- ? 正確&#xff1a;調用 methods 中的方法 --> <button click"handleClick">點擊我</button>new Vue({methods: {handleClick(event) {// 這里可以寫任意語句if (this…

SQLite 子查詢詳解

SQLite 子查詢詳解 引言 SQLite 是一種輕量級的數據庫&#xff0c;以其簡單、易用和跨平臺而著稱。在數據庫查詢中&#xff0c;子查詢是一個非常重要的概念&#xff0c;它允許我們在查詢中使用查詢結果。本文將詳細講解 SQLite 中的子查詢&#xff0c;包括其定義、用法以及在實…

可以組成網絡的服務器 - 華為OD統一考試(JavaScript 題解)

題目描述 在一個機房中,服務器的位置標識在n*m的整數矩陣網格中,1表示單元格上有服務器,0表示沒有。如果兩臺服務器位于同一行或者同一列中緊鄰的位置,則認為它們之間可以組成一個局域網,請你統計機房中最大的局域網包含的服務器個數。 輸入描述 第一行輸入兩個正整數,…

redis,MongoDB等未授權訪問靶場復現

redis未授權訪問在docker中啟動vulhub對應的靶場目錄&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安裝redis程序進行服務連接安裝redis apt-get install redis redis鏈接 redis-cli -h IP -p 端口輸入info可以查看信息接下來我們使用redis-rogue-server來獲取命令執行…

設計模式:代理模式 Proxy

目錄問題解決方案結構代碼代理是一種結構型設計模式&#xff0c;讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問&#xff0c;并允許在將請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f; 舉個例子&#xff1a; 有這樣一…

Linux零基礎Shell教學全集(可用于日常查詢語句,目錄清晰,內容詳細)(自學尚硅谷B站shell課程后的萬字學習筆記,附課程鏈接)

此文章為學習了 尚硅谷B站課程 后的學習筆記 【尚硅谷】Shell腳本從入門到實戰_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1hW41167NW/?spm_id_from333.337.search-card.all.click&vd_source68e0bbe20c8b1102b59ced40f67db628注意&#xff1a;需要先學Linux基礎…

GitLab 中的分支和標簽的定義及操作

&#xff08;一&#xff09;GitLab 中的分支和標簽的定義及操作 1. 分支&#xff08;Branch&#xff09; 定義&#xff1a; 分支是代碼倉庫中的獨立開發路徑&#xff0c;允許你在不影響主線&#xff08;通常是 main 或 master 分支&#xff09;的情況下&#xff0c;進行實驗、開…

第2章 cmd命令基礎:常用基礎命令(3)

Hi~ 我是李小咖&#xff0c;主要從事網絡安全技術開發和研究。 本文取自《李小咖網安技術庫》&#xff0c;歡迎一起交流學習&#x1fae1;&#xff1a;https://imbyter.com 本節介紹的命令有顯示系統信息&#xff08;systeminfo&#xff09;、啟動指定程序&#xff08;start&am…

RabbitMQ 發送方確認的兩大工具 (With Spring Boot)

核心概念解析 發布者確認機制的核心思想是&#xff1a;將消息投遞的可靠性從“盡力而為”提升為“契約保證”。生產者不再是“發后不理”&#xff0c;而是與 Broker 建立一個雙向的溝通渠道。 在 Spring AMQP 的封裝下&#xff0c;這個機制主要由兩個回調接口實現&#xff1a; …