Maven 依賴管理是構建自動化的核心。本文系統講解依賴坐標、六大范圍、傳遞性規則、版本調解機制、排除依賴、版本統一管理,並附生產級父 POM 完整示例。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<type>jar</type> <!-- 默認 jar -->
<scope>test</scope> <!-- 范圍 -->
<optional>false</optional> <!-- 可選 -->
<exclusions>...</exclusions> <!-- 排除傳遞依賴 -->
</dependency>
| Scope | 編譯 | 測試 | 運行 | 打包 | 典型例子 |
|---|---|---|---|---|---|
| compile | Y | Y | Y | Y | spring-core(默認) |
| test | N | Y | N | N | junit |
| provided | Y | Y | N | N | servlet-api(容器提供) |
| runtime | N | Y | Y | Y | JDBC 驅動 |
| system | Y | Y | N | N | 本地 JAR(需 systemPath) |
| import | - | - | - | - | BOM 導入(dependencyManagement) |
A → B → C,A 對 C 為傳遞性依賴。傳遞性依賴范圍由「第一直接依賴范圍」與「第二直接依賴范圍」決定:
| 第一\第二 | compile | test | provided | runtime |
|---|---|---|---|---|
| compile | compile | — | provided | runtime |
| test | test | — | test | test |
| provided | provided | — | provided | provided |
| runtime | runtime | — | provided | runtime |
規律:第二為 compile 時傳遞范圍同第一;第二為 test 不傳遞;第二為 provided 僅傳遞 provided;第二為 runtime 同第一但 compile→runtime。
<optional>true</optional>,需顯式聲明才引入<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.8</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
只需 groupId+artifactId 定位,version 不需要(依賴樹中 GA 唯一)。
<properties>
<spring.version>5.3.21</spring.version>
<mybatis.version>3.5.10</mybatis.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 所有 Spring 模塊統一版本 -->
</dependencies>
</dependencyManagement>
<!-- 子模塊/項目中引用無需版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.version>5.3.21</spring.version>
<junit.version>5.9.2</junit.version>
<logback.version>1.4.11</logback.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring 全家桶統一版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MyBatis、Jackson、JDBC、日誌、測試等 -->
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
依賴管理核心是「版本統一、傳遞可控、衝突可解」。善用 dependencyManagement、exclusions、mvn dependency:tree 分析,構建乾淨穩定的依賴圖。