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>

总结

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

相关文章

  • Spring Boot 中的 Spring Cloud Feign的原理解析

    Spring Boot 中的 Spring Cloud Feign的原

    Spring Cloud Feign 是 Spring Cloud 中的一个组件,它可以帮助我们实现声明式的 REST 客户,这篇文章主要介绍了Spring Boot 中的 Spring Cloud Feign,需要的朋友可以参考下
    2023-07-07
  • Mybatis-Plus实现SQL拦截器的示例

    Mybatis-Plus实现SQL拦截器的示例

    这篇文章主要介绍了Mybatis-Plus实现一个SQL拦截器,通过使用SQL拦截器,开发人员可以在执行SQL语句之前或之后对其进行修改或记录,从而更好地控制和优化数据库操作,对Mybatis-Plus SQL拦截器相关知识感兴趣的朋友一起看看吧
    2023-05-05
  • 详解Spring Boot 项目启动时执行特定方法

    详解Spring Boot 项目启动时执行特定方法

    这篇文章主要介绍了详解Spring Boot 项目启动时执行特定方法,Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner。感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java编程实现暴力破解WIFI密码的方法分析

    Java编程实现暴力破解WIFI密码的方法分析

    这篇文章主要介绍了Java编程实现暴力破解WIFI密码的方法,结合具体实例形式分析了java暴力破解WiFi密码的原理、操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2018-12-12
  • Java List过滤的多种方法及实战应用小结

    Java List过滤的多种方法及实战应用小结

    本文深入探讨了Java List过滤的多种方法及实战应用小结,涉及了使用Collection接口的removeIf方法移除不满足条件的元素,并分析了流API在并行操作中的优势,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 新手小白入门必学JAVA面向对象之多态

    新手小白入门必学JAVA面向对象之多态

    说到多态,一定离不开其它两大特性:封装和继承,下面这篇文章主要给大家介绍了关于新手小白入门必学JAVA面向对象之多态的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • hadoop 单机安装配置教程

    hadoop 单机安装配置教程

    单机安装主要用于程序逻辑调试。安装步骤基本通分布式安装,包括环境变量,主要Hadoop配置文件,SSH配置等,需要的朋友可以参考下
    2012-11-11
  • Mybatis SQL日志如何转换为可执行sql

    Mybatis SQL日志如何转换为可执行sql

    这篇文章主要介绍了Mybatis SQL日志如何转换为可执行sql问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • java版数独游戏核心算法(一)

    java版数独游戏核心算法(一)

    这篇文章主要为大家详细介绍了java版数独游戏的核心算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java实现导出word表格的示例详解

    Java实现导出word表格的示例详解

    这篇文章主要为大家详细介绍了如何利用Java语言导出word表格功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2022-12-12

最新评论