Maven中的<scope>元素使用解读

 更新时间:2025年09月03日 14:49:44   作者:minh_coo  
Maven的<scope>控制依赖范围和生命周期,影响编译、测试、运行阶段的可见性及打包,常见类型包括compile、provided、runtime等,用于管理依赖传递与冲突解决,如使用exclusions排除冲突

Maven的<scope>元素

概述

在 Maven 中,<scope> 元素用于控制依赖项的作用范围生命周期,即定义依赖项在项目的编译、测试、运行等阶段的可见性,以及是否会被打包到最终产物中。

正确使用 <scope> 可以帮助我们优化项目的构建过程,减少不必要的依赖冲突,并提高构建效率。

常见的<scope>取值及其含义

scope作用范围场景示例
compile默认值。覆盖编译(compile)、测试(test)、运行(runtime)所有阶段,依赖会被直接包含到项目的 classpath 中,且会随着项目打包(如 JAR/WAR)一起发布。大多数业务依赖(如 Spring、Jackson 等)默认使用此范围
provided仅在编译(compile)和测试(test)阶段有效,运行(runtime)阶段由外部环境(如应用服务器)提供依赖,依赖不会被打包到项目产物中(因为运行时由外部提供)。容器提供的依赖:Servlet API(如 javax.servlet:javax.servlet-api)
runtime在测试(test)和运行(runtime)阶段有效,编译(compile)阶段不可用。JDBC 驱动(如 mysql:mysql-connector-java)
test仅在测试(test)阶段有效(包括测试代码的编译和运行),依赖不会被打包到最终产物中,也不会影响主代码的运行。测试框架(如 JUnit、Mockito)
system与 provided 类似(仅编译和测试阶段有效),但依赖需要显式指定本地文件路径(非 Maven 仓库),通过 <systemPath> 手动指定依赖的本地路径。不推荐使用,Maven 3.0 后已标记为过时,建议改用 provided 或自定义仓库
import在 <dependencyManagement> 中使用。仅用于导入其他 POM 的 <dependencyManagement> 依赖配置,不会实际添加依赖到当前项目,而是将目标 POM 的依赖管理规则合并到当前项目的依赖管理中。导入 Spring Boot 的 spring-boot-dependencies

依赖传递性

Maven 依赖的传递性会受 <scope> 影响。

假设 A → B → C,即 A 依赖 B,B 依赖 C:

  • compile:C 会传递给 A(A 的 compile 范围)
  • runtime:C 会传递给 A(A 的 runtime 范围)
  • test / provided:C 不会传递给 A(仅 B 自己需要)

依赖冲突

当多个依赖项引入相同的依赖,这时就可能出现版本冲突。

如:在projectA引入B依赖,B依赖又引入C依赖(版本1.0),假设这时projectA再引入D依赖,且D依赖也引入C依赖(版本2.0)。这时就会出现依赖冲突。

冲突解决原则

1、就近原则

A --> B --> C(版本1.0)

A --> C(版本2.0)

这时会引入2.0的C

2、第一声明者原则

A -> B -> C(版本1.0)

A -> D -> C(版本2.0)

这时会引入1.0的C

解决方案

使用<exclusions> 标签排除冲突的依赖,只保留一个依赖。

如:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate.validator</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java收集的雪花算法代码详解

    Java收集的雪花算法代码详解

    这篇文章主要介绍了Java实现雪花算法的详细代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • 面试时必问的JVM运行时数据区详解

    面试时必问的JVM运行时数据区详解

    这篇文章主要介绍了JVM运行时数据区原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Springboot任务之异步任务的使用详解

    Springboot任务之异步任务的使用详解

    今天学习了一个新技能SpringBoot实现异步任务,所以特地整理了本篇文章,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Mybatis-Plus 映射匹配兼容性的问题解决

    Mybatis-Plus 映射匹配兼容性的问题解决

    本文主要介绍了Mybatis-Plus 映射匹配兼容性的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Spring Batch入门教程篇

    Spring Batch入门教程篇

    这篇文章主要给大家介绍了Spring Batch入门的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • SpringBoot2.0 ZipKin示例代码

    SpringBoot2.0 ZipKin示例代码

    这篇文章主要介绍了SpringBoot2.0 ZipKin示例代码,详细的介绍了什么是ZipKin以及SpringBoot2.0 ZipKin示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 解读JDK1.8 默认使用什么垃圾收集器

    解读JDK1.8 默认使用什么垃圾收集器

    这篇文章主要介绍了解读JDK1.8 默认使用什么垃圾收集器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 简单的用java实现读/写文本文件的示例

    简单的用java实现读/写文本文件的示例

    同时也展示了如果从输入流中读出来内容写入输出流中(仅限文本流) 三个例子可以独立存在,所以根据需要只看其中一个就行了。
    2008-07-07
  • java中Hutool包的常用方法总结

    java中Hutool包的常用方法总结

    这篇文章主要为大家详细介绍了java在工作中中Hutool包的一些常用方法总结,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    解决Spring Data Jpa 实体类自动创建数据库表失败问题

    这篇文章主要介绍了解决Spring Data Jpa 实体类自动创建数据库表失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论