Maven之dependencyManagement
為什麼要使用dependencyManagement
最近在找lombok+log4j2
的依賴時,由於在國內怎麼找都找不到,但是我意外的卻發現Spring Boot中居然就已經集成了該依賴項,該依賴是整合在下面的依賴中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version >1.5.4.RELEASE</version>
</dependency>
所以說我趕緊拿來分解研究,誰知遇到的第一個問題居然是依賴包衝突,雖然說Maven有自己的解決依賴包版本衝突的機制,但是對於有潔癖的人來說,當我們看到下面的資訊時,仍然會感覺渾身不爽。
出現該問題的原因是slf4j-api
依賴發現了有兩個版本,分別是1.7.25
和1.7.21
,此時Maven不知道該要依賴哪個,所以說就報出了該故障。而Spring Boot其實是有解決該問題的方案的,就是在spring-boot-starter-log4j2
中引入父模組,通過在父模組中採用dependencyManagement
dependencyManagement描述
對於dependencyManagement,我們可以參考其官方的描述資訊,在官方文件中,其描述資訊是這樣的:
對於從這一項繼承的專案的預設依賴資訊。這個部分的依賴關係沒有立即得到解決。相反,當從這個派生的POM宣告一個匹配的groupId和artifactId所描述的依賴項時,這個部分的版本和其它值將被用於該依賴項,如果它們還沒有被指定的話。
簡而言之就是在父Maven模組中通過dependencyManagement來指定子模組中的Maven依賴版本號。
dependencyManagement舉例
在spring-boot-starter-log4j2
中,其實我們引入的依賴是這樣的:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
而產生版本衝突的原因是slf4j-api
中包含了1.7.25
和1.7.21
兩個版本號,因而在其父模組的解決方案中就是新增dependencyManagement,在該dependencyManagement中我們指定slf4j-api
的版本號,如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</dependencyManagement>
下面是該衝突解決之後的結果: