在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就會非常干凈,容易維護
參考文章: