dependencyManagement和dependencies的区别

81 阅读2分钟

dependencyManagement和dependencies的区别

dependencyManagement (依赖管理)

dependencyManagement是一个用于管理依赖版本和范围的机制, 它本身不会引入依赖, 只是声明依赖的版本、类型、范围、排除等。

特点:

  • 通常在父 POM 中使用
  • 不实际引入依赖,只声明依赖的版本信息
  • 子模块可以继承这些版本信息而无需重复指定
  • 主要用于统一管理多模块项目的依赖版本
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.8</version>
        </dependency>
    </dependencies>
</dependencyManagement>

dependencies (依赖声明)

dependencies 元素用于直接声明和引入项目所需的依赖。这些依赖会被实际下载并包含在项目的 classpath 中。

特点:

  • 在父 POM 和子模块中都可以使用
  • 声明的依赖会被实际引入项目
  • 每个依赖需要指定完整的坐标 (groupId, artifactId, version)
  • 依赖会传递给依赖该模块的其他项目
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.8</version>
    </dependency>
</dependencies>

核心区别对比表

特性dependenciesdependencyManagement
作用实际引入依赖管理依赖版本
依赖传递依赖会传递给子模块不会传递依赖
版本要求必须指定版本可省略版本(在子模块中)
实际下载会下载依赖不会下载依赖
使用位置所有POM文件主要在父POM
主要用途声明项目实际需要的依赖统一管理多模块依赖版本

最佳实践

  1. 多模块项目统一管理

    • 在父POM中使用dependencyManagement定义所有公共依赖版本
    • 子模块只需声明依赖,无需指定版本
  2. 避免版本冲突

    • 使用dependencyManagement确保所有模块使用相同依赖版本
    • 减少不同模块使用不同版本导致的冲突
  3. 灵活覆盖版本

    • 子模块可以覆盖父POM中定义的版本(如果需要特殊版本)
  4. BOM文件使用

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.5.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

总结

场景推荐使用
单模块项目dependencies
多模块项目

父POM: dependencyManagement

子模块: dependencies

导入第三方BOMdependencyManagement + scope=import
管理插件版本pluginManagement

正确使用 dependencyManagement 和 dependencies 可以使 Maven 项目更易于维护, 减少版本冲突, 提高构建一致性。在多模块项目中, 这种分离管理的方式尤为重要。