Maven-dependencyManagement的使用(父類pom應用)

1. DepencyManagement應用場景

當我們的項目模塊很多的時候,我們使用Maven管理項目非常方便,幫助我們管理構建、文檔、報告、依賴、scms、發佈、分發的方法。可以方便的編譯代碼、進行依賴管理、管理二進制庫等等。
由於我們的模塊很多,所以我們又抽象了一層,如下圖抽出一個femicro來管理子項目的公共的依賴。爲了項目的正確運行,必須讓所有的子項目使用依賴項的統一版本,必須確保應用的各個項目的依賴項和版本一致,才能保證測試的和發佈的是相同的結果。
在我們項目頂層的POM文件中,我們會看到dependencyManagement元素。通過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本號。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,然後它就會使用在這個dependencyManagement元素中指定的版本號。

2. 父類POM配置

繼承自springboot-parent

 

本項目中,父類POM中dependencyManagement配置

 

    <!--依賴管理,用於管理spring-cloud的依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.33</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.11</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

3. 子類POM配置

 

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.fredia</groupId>
        <artifactId>femicro</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>femicro-cache</artifactId>
    <name>femicro-cache</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.7</version>
        </dependency>
    </dependencies>
</project>

點擊進入fastjson,發現是有剛剛的父類所管控版本

version

 

4. 優點分析

統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,因此,在頂層pom中定義共同的依賴關係。同時可以避免在每個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另一個版本時,只需要在父類容器裏更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個版本號時,只需要在dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承於父類版本號。

5. dependencies

相對於dependencyManagement,所有生命在dependencies裏的依賴都會自動引入,並默認被所有的子項目繼承。

6. dependencies與dependencyManagement搭配使用

  • dependencies即使在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(全部繼承)
  • dependencyManagement裏只是聲明依賴,並不實現引入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,並且沒有指定具體版本,纔會從父項目中繼承該項,並且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那麼會使用子項目中指定的jar版本。

7. Maven約定優於配置

這一概念和springboot很契合,爲項目提供合理的默認行爲,無需不必要的配置,提供了默認的目錄

  • src ——> 源代碼和測試代碼的根目錄
    • main 應用代碼的源目錄
      • java 源代碼
      • resources 項目的資源文件
    • test 測試代碼的源目錄
      • java 測試代碼
      • resources 測試的資源文件
  • target 編譯後的類文件、jar文件等

8. 總結

對於Maven約定優於配置的理解,一方面對於小型項目基本滿足我們的需要基本不需要自己配置東西,使用Maven已經配置好的,快速上手,學習成本降低;另一方面,對於不滿足我們需要的還可以自定義設置,體現了靈活性。配置大量減少了,隨着項目變的越複雜,這種優勢就越明顯。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章