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

在maven多模塊項目中,爲了保持模塊間依賴的統一,常規作法是在parent model中,使用dependencyManagement預約義全部模塊須要用到的dependency(依賴)java

<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中預約義的依賴spring

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

好處:編程

一、依賴統一管理(parent中定義,須要變更dependency版本,只要修改一處便可);maven

二、代碼簡潔(子model只須要指定groupId、artifactId便可)spring-boot

三、dependencyManagement只會影響現有依賴的配置,但不會引入依賴,即子model不會繼承parent中dependencyManagement全部預約義的depandency,只引入須要的依賴便可,簡單說就是「按需引入依賴」或者「按需繼承」;所以,在parent中嚴禁直接使用depandencys預約義依賴,壞處是子model會自動繼承depandencys中全部預約義依賴;spa

 

可是,問題也出現了:.net

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

parent模塊中,dependencyManagement中預約義太多的依賴,形成pom文件過長,並且很亂;blog

如何讓這些依賴能夠分類並清晰的管理?繼承

 

問題解決:import scope依賴

如何使用:

一、maven2.9以上版本

二、將dependency分類,每一類創建單獨的pom文件

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

三、注意: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文件以下:

好處分析:

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

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

三、父模塊的pom就會很是乾淨,容易維護

 

參考文章:

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

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

Maven中的import scope

maven之非繼承引用dependency

相關文章
相關標籤/搜索