maven:dependencyManagement和dependencies比較.md

1背景

參考https://www.cnblogs.com/feibazhf/p/7886617.html

在看公司項目時,經常在maven的pom配置文件中看到類似如下的結構:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.7.RELEASE</version>
<parent/>

<dependencies>
  <dependency>
    <groupId>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0.0.RELEASE</version>
  <dependency/>
<dependencies/>

<dependencyManagement>  
          
        <dependencies>  
            <dependency>  
                <groupId>org.eclipse.persistence</groupId>  
                <artifactId>org.eclipse.persistence.jpa</artifactId>  
                <version>${org.eclipse.persistence.jpa.version}</version>  
                <scope>provided</scope>  
            </dependency>  
              
            <dependency>  
                <groupId>javax</groupId>  
                <artifactId>javaee-api</artifactId>  
                <version>${javaee-api.version}</version>  
            </dependency>  
        </dependencies>  
    </dependencyManagement>

就像標題中說明的,既有依賴標籤,又有依賴管理標籤,這兩種的所用是什麼的呢?

2 dependencies標籤

只有在dependencies和dependency中聲明聲明的依賴纔會被自動引入!!!包括從父pom中繼承而來的dependencies和dependency中聲明的依賴,同樣會被的自動引入。同樣的,就像所有的繼承一樣,如果子pom和父pom都定義了一樣依賴的,版本號和scope肯定是按照子類自己定義來的來的。

3 dependencyManagement標籤

該標籤的內定義的依賴,只是聲明瞭,以後有子pom繼承時,子pom的dependencies只需要聲明具體的依賴,而不必寫明版本號,子pom默認的版本號直接使用父pom的dependencyManagement中定義的版本,如果子pom又明確了自己依賴的版本,則會引入子pom自己定義的版本。
爲什麼要這樣設計呢?
當我們的項目模塊很多的時候,我們使用Maven管理項目非常方便,幫助我們管理構建、文檔、報告、依賴、scms、發佈、分發的方法。可以方便的編譯代碼、進行依賴管理、管理二進制庫等等。
當項目的模塊很多時,我們可以抽象父pom來管理子項目的公共的依賴。爲了項目的正確運行,必須讓所有的子項目使用的依賴項版本一致。
因此,在公共依賴項目POM文件中,就行設置dependencyManagement元素。通過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本號。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,然後它就會使用在這個dependencyManagement元素中指定的版本號。
和dependencies標籤重大區別還是要強調一下:
dependencyManagement裏只是聲明依賴,並不實現引入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承dependencyManagement裏的依賴;只有在子項目的dependencies中寫了該依賴項,並且沒有指定具體版本,纔會從父項目中繼承該項,並且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那麼會使用子項目中指定的jar版本。

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