大家好,這里是架構資源棧!點擊上方關注,添加“星標”,一起學習大廠前沿架構!
建議使用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
,采用ClassAnalyzer
和DependencyAnalyzer
。–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
- 設置自動配置類的順序
RestTemplate
如果類位于類路徑上則激活- 如果我們不在響應式 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