Maven dependencyManagement元素標簽的具體使用
我們知道,子模塊可以通過繼承獲得父模塊中聲明的全部依賴,這樣雖然避免了在各個子模塊 POM 中重復進行依賴聲明,但也極有可能造成子模塊中引入一些不必要的依賴。為此 Maven 引入了 dependencyManagement 來對依賴進行管理。
依賴管理
Maven 可以通過 dependencyManagement 元素對依賴進行管理,它具有以下 2 大特性:
- 在該元素下聲明的依賴不會實際引入到模塊中,只有在 dependencies 元素下同樣聲明了該依賴,才會引入到模塊中。
- 該元素能夠約束 dependencies 下依賴的使用,即 dependencies 聲明的依賴若未指定版本,則使用 dependencyManagement 中指定的版本,否則將覆蓋 dependencyManagement 中的版本。
例如,修改 App-Data-lib 模塊的 pom.xml 如下。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--由于不是繼承,所以必須重新添加 groupId 和 version-->
<groupId>org.example</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<!--dependencyManagement 標簽用于控制子模塊的依賴版本等信息 -->
<!-- 該標簽只用來控制版本,不能將依賴引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<!--引用的properties標簽中定義的屬性 -->
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用的properties標簽中定義的屬性 -->
<version>4.9</version>
<!-- <scope>test</scope> -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--引用的properties標簽中定義的屬性 -->
<version>5.1.18</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<!--引用的properties標簽中定義的屬性 -->
<version>0.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--聲明依賴-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
在以上配置中,由于 dependencyManagement 元素中已經定義完整的依賴聲明,所以在 dependencies 元素中聲明的依賴只配置了 groupId 和 artifactId,省略了 version 和 scope。
在實際的開發(fā)過程中,dependencyManagement 很少會單獨使用,通常它需要與 Maven 繼承或依賴范圍 import 配合使用才能展現它的優(yōu)勢。
繼承依賴管理
由于 dependencyManagement 元素是可以被繼承的,因此我們可以在父模塊 POM 中使用 dependencyManagement 元素聲明所有子模塊的依賴,然后在各個子模塊 POM 使用 dependencies 元素聲明實際用到的依賴即可。這樣既可以讓子模塊能夠繼承父模塊的依賴配置,還能避免將不必要的依賴引入到子模塊中。
1. 修改父模塊 Root 的 pom.xml 如下。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<!--定義的父類pom.xml 打包類型使pom -->
<packaging>pom</packaging>
<properties>
<!-- 定義一些 maven 變量 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.9</junit.version>
<system.version>1.0</system.version>
<mysql.connector.version>5.1.18</mysql.connector.version>
<c3p0.version>0.9.1</c3p0.version>
</properties>
<!--dependencyManagement 標簽用于控制子模塊的依賴版本等信息 -->
<!-- 該標簽只用來控制版本,不能將依賴引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<!--引用的properties標簽中定義的變量 -->
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用的properties標簽中定義的變量 -->
<version>${junit.version}</version>
<!-- <scope>test</scope> -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--引用的properties標簽中定義的變量 -->
<version>${mysql.connector.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<!--引用的properties標簽中定義的變量 -->
<version>${c3p0.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注:以上配置中,將所有依賴的版本信息以 Maven 變量(properties)的形式提取出來,這樣不僅消除了一些重復,也使得各個依賴的版本信息更加明顯,便于管理。
在父模塊 Root 中使用 dependencyManagement 元素聲明的依賴,既不會給 Root 模塊引入依賴,也不會給其子模塊引入依賴,但這段配置是可以被繼承的。
2. 修改子模塊 App-Core-lib 的 pom.xml 如下。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>App-Core-lib</artifactId>
<parent>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<relativePath>../Root</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>bianchengbang_Release_hosted</id>
<url>http://localhost:8082/nexus/content/repositories/bianchengbang_Release_hosted/</url>
</repository>
<snapshotRepository>
<id>Snapshot</id>
<url>http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hosted/</url>
</snapshotRepository>
</distributionManagement>
</project>
在子模塊 App-Core-lib 和 App-Data-lib 的 POM 中,所有在 dependencies 元素中聲明的依賴都只配置了 groupId 和 artifactId,省去了 version 和 scope。之所以能夠省略這些信息,是因為它們繼承了父模塊 Root 中 dependencyManagement 的配置,其完整的依賴聲明已經包含在父模塊的 POM 中,子模塊只需要配置 groupId 和 artifactId 就能獲得相應的依賴信息,從而引入正確的依賴。
使用這種依賴管理機制似乎并不能減少太多 POM 配置,但我們仍然推薦使用這種方式,其原因主要有 2 個:
-在父模塊中使用 dependencyManagement 聲明依賴能夠統(tǒng)一項目內依賴的版本,子模塊無須聲明版本,也就不會出現多個子模塊使用同一依賴項版本不一致的情況,降低依賴沖突的幾率。
- dependencyManagement 聲明的依賴不會被實際引入,子模塊需要什么依賴就自己引入,增加了靈活性,避免引入一些不必要的依賴。
導入依賴管理
因為 import 依賴范圍只能與 dependencyManagement 元素配合使用才會有效,其功能是將目標 pom.xml 中的 dependencyManagement 配置導入合并到當前 pom.xml 的 dependencyManagement 中。
例如,App-Data-lib 模塊想要使用 Root 模塊中的 dependencyManagement 配置,除了通過繼承或者直接復制這兩種方式之外,還可以使用 import 依賴范圍將其導入,具體配置如下。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--由于不是繼承,所以必須重新添加 groupId 和 version-->
<groupId>org.example</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<!--定義依賴管理-->
<dependencyManagement>
<dependencies>
<!--導入依賴管理配置-->
<dependency>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<!--依賴范圍為 import-->
<scope>import</scope>
<!--類型一般為pom-->
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<!--聲明依賴-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
以上配置中,由于 import 依賴范圍的特殊性,一般都是指向打包類型為 pom 的模塊,所以 type 元素的值一般為 pom。
若存在多個模塊,它們使用的依賴版本都是一致的,則就可以定義一個使用 dependencyManagement 專門管理依賴的 POM,然后在各個模塊中導入這些依賴管理配置。
到此這篇關于Maven dependencyManagement元素標簽的具體使用的文章就介紹到這了,更多相關Maven dependencyManagement內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

