首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Maven 依賴管理深度解析:坐標、范圍、傳遞性、調解、排除、版本統一最佳實踐

     編輯:Java 綜合教學

Maven 依賴管理深度解析:坐標、范圍、傳遞性、調解、排除、版本統一最佳實踐

Maven 依賴管理是構建自動化的核心。本文系統講解依賴坐標、六大范圍、傳遞性規則、版本調解機制、排除依賴、版本統一管理,並附生產級父 POM 完整示例。

1. 依賴坐標(GAV)

<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>

2. 六大依賴范圍

Scope編譯測試運行打包典型例子
compileYYYYspring-core(默認)
testNYNNjunit
providedYYNNservlet-api(容器提供)
runtimeNYYYJDBC 驅動
systemYYNN本地 JAR(需 systemPath)
import----BOM 導入(dependencyManagement)

3. 傳遞性依賴與范圍調解

A → B → C,A 對 C 為傳遞性依賴。傳遞性依賴范圍由「第一直接依賴范圍」與「第二直接依賴范圍」決定:

第一\第二compiletestprovidedruntime
compilecompile—providedruntime
testtest—testtest
providedprovided—providedprovided
runtimeruntime—providedruntime

規律:第二為 compile 時傳遞范圍同第一;第二為 test 不傳遞;第二為 provided 僅傳遞 provided;第二為 runtime 同第一但 compile→runtime。

4. 版本調解:最近優先、首聲明優先

  • 最短路徑優先:A→B→C→X(1.0) vs A→D→X(2.0) → 選 X(2.0)(路徑長度 2 vs 3)
  • 首聲明優先:路徑長度相同時,POM 中先聲明的依賴勝出
  • 可選依賴不傳遞:<optional>true</optional>,需顯式聲明才引入

5. 排除傳遞性依賴

<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 唯一)。

6. 版本統一管理:properties + dependencyManagement

<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>

7. 生產級父 POM 完整示例(節選關鍵段)

<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 分析,構建乾淨穩定的依賴圖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved