maven中import scope依賴方式解決單繼承問題的理解


在maven多模塊項目中,為了保持模塊間依賴的統一,常規做法是在parent model中,使用dependencyManagement預定義所有模塊需要用到的dependency(依賴)

<dependencyManagement>
        <dependencies>
            <!-- Feign是一種聲明式、模板化的HTTP客戶端:以HTTP接口的形式暴露自身服務 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
                <version>${spring-cloud-starter-feign.version}</version>
            </dependency>
            <!-- 支持面向方面的編程即AOP,包括spring-aop和AspectJ -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${aspectjrt.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

然后,子model根據實際需要引入parent中預定義的依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>

好處:

1、依賴統一管理(parent中定義,需要變動dependency版本,只要修改一處即可);

2、代碼簡潔(子model只需要指定groupId、artifactId即可)

3、dependencyManagement只會影響現有依賴的配置,但不會引入依賴,即子model不會繼承parent中dependencyManagement所有預定義的depandency,只引入需要的依賴即可,簡單說就是“按需引入依賴”或者“按需繼承”;因此,在parent中嚴禁直接使用depandencys預定義依賴,壞處是子model會自動繼承depandencys中所有預定義依賴;

 

但是,問題也出現了:

單繼承:maven的繼承跟java一樣,單繼承,也就是說子model中只能出現一個parent標簽;

parent模塊中,dependencyManagement中預定義太多的依賴,造成pom文件過長,而且很亂;

如何讓這些依賴可以分類並清晰的管理?

 

問題解決:import scope依賴

如何使用:

1、maven2.9以上版本

2、將dependency分類,每一類建立單獨的pom文件

3、在需要使用到這些依賴的子model中,使用dependencyManagement管理依賴,並import scope依賴

3、注意:scope=import只能用在dependencyManagement里面,且僅用於type=pom的dependency

示例:

 

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <!-- 重要:版本號要和父模塊中預定義的spring boot版本號保持一致 -->
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 maven編譯后,下載了pom文件,在maven的本地倉庫下查看pom文件如下:

好處分析:

1、單一職責原則,根據依賴的分類,細化每一個單一職責的pom文件

2、解決單繼承問題,通過import pom文件達到依賴的目的(典型的非繼承模式),從而不用從父類中引用依賴

3、父模塊的pom就會非常干凈,容易維護

 

參考文章:

Maven實戰(三)——多模塊項目的POM重構

使用import scope解決maven繼承(單)問題

Maven中的import scope

maven之非繼承引用dependency

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM