在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就會很是乾淨,容易維護
參考文章: