1. 程式人生 > >Maven之dependencyManagement

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.251.7.21,此時Maven不知道該要依賴哪個,所以說就報出了該故障。而Spring Boot其實是有解決該問題的方案的,就是在spring-boot-starter-log4j2中引入父模組,通過在父模組中採用dependencyManagement

,在此定義子類中的Maven依賴版本號,正是通過如此,我們才能夠解決上述問題。

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.251.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>

  下面是該衝突解決之後的結果:

這裡寫圖片描述