改善 Maven 的依賴性

大家好,這里是架構資源棧!點擊上方關注,添加“星標”,一起學習大廠前沿架構!

建議使用mvn dependency:analyze命令來擺脫已聲明但未使用的依賴項:

還有另一個用例, mvn dependency:analyze 它可以顯示您在代碼中使用但未在 pom.xml 中聲明的依賴項。這有效是因為您對類路徑具有傳遞依賴性。要么不使用該依賴項,要么聲明它。

雖然幾年前這是一個好主意,但今天卻是一個危險的建議。在這篇文章中,我想解釋一下這個插件的作用以及為什么不應該在最簡單的項目中使用它。

命令mvn dependency:analyze?

Maven 使用插件架構;在上面的命令中,插件是maven-dependency-plugin。一個插件承載著幾個相關的_目標_。在這里,它是analyze

分析此項目的依賴項并確定哪些是:已使用且已聲明;已使用且未聲明;未使用且已聲明。此目標旨在獨立使用,因此它始終執行該test-compile階段 -dependency:analyze-only在參與構建生命周期時改用該目標。

默認情況下,maven-dependency-analyzer用于執行分析,由于它在字節碼級別工作而存在限制,但可以通過analyzer參數插入任何分析器。

–依賴項:分析

maven-dependency-analyzer是一個共享的 Maven 組件。它的描述相當詳細:

分析項目中未聲明或未使用的工件的依賴關系。

警告:由于分析是在字節碼而不是源代碼上進行的,因此有些情況無法檢測到,包括常量、僅保留源代碼的注釋以及 Javadoc 中的鏈接。當這些是依賴項的唯一用途時,這可能會導致不正確的結果。

主要成分為ProjectDependencyAnalyzer,采用ClassAnalyzerDependencyAnalyzer

–maven依賴分析器

警告清楚地表明它在_字節碼_級別起作用。特別是,它明確提到它不考慮源級注釋。

Spring Boot 啟動器

很久以前,我描述了如何設計自己的 Spring Boot starter ,從那時起它就沒有發生過太大的變化。如果你剛接觸 Spring Boot starter,這里有一個總結。

SpringBoot 依賴于 AutoConfiguration 類。AutoConfiguration 類是常規配置類,_即_它們對應用程序類有所貢獻。您可以設置特定的激活條件,例如 Spring 屬性的存在,但這些條件并非特定于自動配置。

這是一個非常簡化的流程:

Spring Boot 自動附帶的 JAR 是org.springframework.boot:spring-boot-autoconfigure。你可以檢查其內容META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

...
org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

Enter fullscreen mode Exit fullscreen mode

舉個例子,下面是RestClientAutoConfiguration

@AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1
@ConditionalOnClass(RestTemplate.class)                //2
@Conditional(NotReactiveWebApplicationCondition.class) //3
public class RestTemplateAutoConfiguration {// Class body
}

Enter fullscreen mode Exit fullscreen mode

  1. 設置自動配置類的順序
  2. RestTemplate如果類位于類路徑上則激活
  3. 如果我們不在響應式 Web 應用環境中則激活

請注意,無論類是否__在類路徑上,類加載器RestTemplateAutoConfiguration都可以正常加載類!如上所示,Spring 充分利用了此機制。實際上,注釋中配置的類的解析被推遲到_顯式_訪問它們為止。RestTemplate

帶入maven-dependency-analyzer現代

提交者在 2007 年設計了該分析器:當時它的樣子如下。Spring Boot 的推出時間較晚,為 2010 年。因此,該分析器未在注釋中采用延遲類加載。請注意,現在情況仍然如此;該項目并沒有得到太多的關注。

在 Spring Boot 項目中使用該插件時,您會得到很多誤報。我在一個簡單的 Spring Boot 項目中嘗試了它,在 PostgreSQL 上使用 WebFlux 和 R2DBC。

以下是我運行時輸出的一小部分摘錄mvn analyze:dependencies

[WARNING] Unused declared dependencies found:
[WARNING]   org.springframework.boot:spring-boot-starter-data-r2dbc:jar:3.4.0:compile
[WARNING]   org.testcontainers:postgresql:jar:1.20.4:test
[WARNING]   org.testcontainers:r2dbc:jar:1.20.4:test

Enter fullscreen mode Exit fullscreen mode

如果我刪除任何這些依賴項,測試就不會運行。

要使分析器與 Spring Boot 項目一起工作,需要什么?讓我們分析一下分析器。

該插件允許配置另一個分析器:

指定要使用的項目依賴項分析器(plexus 組件角色提示)。默認情況下,使用 maven-dependency-analyzer。要使用此功能,您必須為此插件聲明一個包含分析器代碼的依賴項。分析器必須具有聲明的 Plexus 角色名稱,您可以在此處指定角色名稱。

  • 類型java.lang.String
  • 自從2.2
  • 必需的No
  • 用戶屬性analyzer
  • 默認default

–依賴項:分析

我們可以創建一個整體的分析器,重復使用上面的內容,但添加一個特定于 Spring Boot 的分析器。

結論

Maven 分析器的當前狀態對現代 Spring Boot 項目沒有任何好處。現有代碼可供配置甚至擴展。但是,我們需要嵌入大量 Spring Boot 邏輯。對于 Quarkus 和 Micronaut 項目,我們還需要專用代碼。

我不知道這是否值得花費時間和精力。如果你認為值得,我希望這篇博文可以作為早期的分析。

進一步來說:

  • 依賴關系:分析
  • Maven 依賴分析器
  • 設計你自己的 Spring Boot 啟動器 – 第 1 部分
  • 設計你自己的 Spring Boot 啟動器 – 第 2 部分

原文地址:https://mp.weixin.qq.com/s/ro3EWXyoQKI0EcUqOZTLsQ

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

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

相關文章

【SQL】子查詢詳解(附例題)

子查詢 子查詢的表示形式為:(SELECT 語句),它是IN、EXISTS等運算符的運算數,它也出現于FROM子句和VALUES子句。包含子查詢的查詢叫做嵌套查詢。嵌套查詢分為相關嵌套查詢和不想關嵌套查詢 WHERE子句中的子查詢 比較運算符 子查詢的結果是…

Stable Diffusion 擴展知識實操整合

本文的例子都是基于秋葉整合包打開的webui實現的 一、ADetailer——改善人臉扭曲、惡心 After detailer插件可以自動檢測生成圖片的人臉,針對人臉自動上蒙版,自動進行重繪,整個流程一氣呵成,因此可以避免許多重復的操作。除此之…

freertos內存管理簡要概述

概述 內存管理的重要性 在嵌入式系統中,內存資源通常是有限的。合理的內存管理可以確保系統高效、穩定地運行,避免因內存泄漏、碎片化等問題導致系統崩潰或性能下降。FreeRTOS 的內存管理機制有助于開發者靈活地分配和釋放內存,提高內存利用…

按規則批量修改文件擴展名、刪除擴展名或添加擴展名

文件的擴展名是多種多樣的,有些不同文件的擴展名之間相互是可以直接轉換的。我們工作當中最常見的就是 doc 與 docx、xls 與 xlsx、jpg 與 jpeg、html 與 htm 等等,這些格式在大部分場景下都是可以相互轉換 能直接兼容的。我們今天要介紹的就是如何按照一…

熱門面試題第15天|最大二叉樹 合并二叉樹 驗證二叉搜索樹 二叉搜索樹中的搜索

654.最大二叉樹 力扣題目地址(opens new window) 給定一個不含重復元素的整數數組。一個以此數組構建的最大二叉樹定義如下: 二叉樹的根是數組中的最大元素。左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。右子樹是通過數組中最大值右邊部分構造出的最大…

MySQL學習筆記7【InnoDB】

Innodb 1. 架構 1.1 內存部分 buffer pool 緩沖池是主存中的第一個區域,里面可以緩存磁盤上經常操作的真實數據,在執行增刪查改操作時,先操作緩沖池中的數據,然后以一定頻率刷新到磁盤,這樣操作明顯提升了速度。 …

RNN、LSTM、GRU匯總

RNN、LSTM、GRU匯總 0、論文匯總1.RNN論文2、LSTM論文3、GRU4、其他匯總 1、發展史2、配置和架構1.配置2.架構 3、基本結構1.神經元2.RNN1. **RNN和前饋網絡區別:**2. 計算公式:3. **梯度消失:**4. **RNN類型**:(查看發展史)5. **…

django數據遷移操作受阻

錯誤信息: django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根據錯誤信息分析,該問題是由于MySQL用戶 缺乏SYSTEM_VARI…

WinForm真入門(13)——ListBox控件詳解

WinForm ListBox 詳解與案例 一、核心概念 ?ListBox? 是 Windows 窗體中用于展示可滾動列表項的控件,支持單選或多選操作,適用于需要用戶從固定數據集中選擇一項或多項的場景?。 二、核心屬性 屬性說明?Items?管理列表項的集合,支持動…

局域網內文件共享的實用軟件推薦

軟件介紹 在日常辦公、學習或家庭網絡環境里,局域網內文件共享是個常見需求。有一款免費的局域網共享軟件非常適合這種場景。 這款局域網共享軟件使用起來非常簡單,不需要安裝,直接點擊就能使用。 它的操作流程簡單易懂,用戶只要…

ViewModel vs AndroidViewModel:核心區別與使用場景詳解

在 Android 的 MVVM 架構中,ViewModel 和 AndroidViewModel 都是用于管理 UI 相關數據的組件,但二者有一些關鍵區別: 1. ViewModel 基本用途:用于存儲和管理與 UI 相關的數據,生命周期與 Activity/Fragment 解耦&…

C語言--求n以內的素數(質數)

求n以內的素數,可以用試除法或者埃拉托斯特尼篩法(埃氏篩法) 文章目錄 試除法埃拉托斯特尼篩法(埃氏篩法)兩種方法測試運行效率 輸入:數字n 輸出:n以內所有的素數 不管是哪個方法,都…

Skynet.socket 函數族使用詳解

目錄 Skynet.socket 函數族使用詳解核心功能分類一、TCP 連接管理1. 監聽端口2. 建立連接3. 關閉連接 二、數據讀寫操作1. 阻塞式讀取2. 寫入數據2.1 socket.write(fd, data) 的返回值2.2 示例代碼2.3 關鍵注意事項2.4 與其他函數的區別2.5 底層原理2.6 總結 三、UDP 處理1. 創…

Unity Addressables資源生命周期自動化監控技術詳解

一、Addressables資源生命周期管理痛點 1. 常見資源泄漏場景 泄漏類型典型表現檢測難度隱式引用泄漏腳本持有AssetReference未釋放高異步操作未處理AsyncOperationHandle未釋放中循環依賴泄漏資源相互引用無法釋放極高事件訂閱泄漏未取消事件監聽導致對象保留高 2. 傳統管理…

aws(學習筆記第三十八課) codepipeline-build-deploy-github-manual

文章目錄 aws(學習筆記第三十八課) codepipeline-build-deploy-github-manual學習內容:1. 整體架構1.1 代碼鏈接1.2 全體處理架構2. 代碼分析2.1 創建`ImageRepo`,并設定給`FargateTaskDef`2.2 創建`CodeBuild project`2.3 對`CodeBuild project`賦予權限(`ECR`的`image rep…

在windows服務器使用Nginx反向代理云端的python實現的web應用

近日得閑,計劃將之前寫過的一些小桌面程序搬到云服務器上方便隨時隨地使用,同時也學習一些基本的網站開發和搭建知識,于是在AI的幫助下,基于niceguifastapi非常快捷地搞出來了一個前后端一體的網站程序,放在云服務器上…

全球貿易戰火重燃:50%關稅如何絞殺跨境電商低價模式?

一、政策高壓:美國對華貿易戰升級路線圖 2024年5月,美國國會《數字貿易壁壘法案》草案曝光,標志著中美貿易博弈進入新階段: ? 關稅武器精準打擊:成衣、消費電子、小家電稅率擬從10-25%躍升至50% ? 監管范圍擴大&…

0411 | 軟考高項筆記:項目立項

在軟考的項目管理知識體系中,技術可行性和經濟可行性是項目立項階段非常重要的兩個分析維度。以下是對這兩個考點的詳細解釋和記憶方法: 技術可行性分析 定義: 技術可行性分析是評估項目在現有技術條件和資源下是否能夠成功實施。它主要回答…

二分查找3:69. x 的平方根

鏈接:69. x 的平方根 - 力扣(LeetCode) 題解: 本題本質是二分查找右端點 x的算數平方根一定在1 ~ x 區間內,在1 ~ x區間內查找一個數num,num^2x,但實際上num不一定是整數,所以是n…

oracle大師認證證書有用嗎

專業能力的高度認可:OCM 是 Oracle認證的最高級別,是對數據庫從業人員技術、知識和操作技能的最高級認可,也是 IT 界頂級認證之一。它表明持證者具備處理關鍵業務數據庫系統和應用的能力,能夠解決最困難的技術難題和最復雜的系統故…