当前位置: 首页 > news >正文

【Maven】-- Maven Scope 详解

目录

Maven Scope 详解

1. 引言

2. Maven 依赖范围(Scope)分类

2.1 compile(默认范围)

2.2 provided

2.3 runtime

2.4 test

2.5 system

2.6 import(仅用于 dependencyManagement)

3. Scope 作用范围总结

4. 结论


Maven Scope 详解

1. 引言

Maven 是 Java 项目构建和依赖管理的标准工具。在使用 Maven 进行依赖管理时,scope(作用范围)是一个重要的概念。Maven scope 决定了依赖项在编译、测试、运行等不同阶段的可用性。

本文将详细介绍 Maven 中的各种 scope 及其适用场景。


2. Maven 依赖范围(Scope)分类

Maven 主要提供以下几种 scope

2.1 compile(默认范围)

特点:

  • 依赖项在编译测试运行阶段均可用。
  • 这是 Maven 依赖的默认范围,如果未指定 scope,则默认使用 compile

适用场景:

  • 适用于编译期必须使用的依赖,例如 javax.servlet-api(如果是 web 应用)。

示例:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
    <scope>compile</scope>
</dependency>

2.2 provided

特点:

  • 依赖项在编译测试阶段可用,但在运行时不可用。
  • 适用于那些在运行时由容器或 JDK 提供的依赖。

适用场景:

  • 适用于 Web 项目中的 javax.servlet-api,因为它在运行时由 Tomcat 或其他服务器提供。
  • 适用于使用 JDK 自带库(如 tools.jar)的情况。

示例:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

2.3 runtime

特点:

  • 依赖项在测试运行阶段可用,但在编译时不可用。
  • 适用于那些只在运行时才需要的依赖。

适用场景:

  • 适用于 JDBC 驱动,如 mysql-connector-java,因为编译时通常不需要它,但运行时必须可用。

示例:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
    <scope>runtime</scope>
</dependency>

2.4 test

特点:

  • 依赖项仅在测试阶段可用,不会参与编译和运行。
  • 适用于单元测试框架或测试相关工具。

适用场景:

  • 适用于 JUnit、Mockito 等测试框架。

示例:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

2.5 system

特点:

  • 类似于 provided,但依赖项必须通过 systemPath 指定本地路径
  • 这种方式不建议使用,因为它破坏了 Maven 的依赖管理机制。

适用场景:

  • 适用于那些无法通过远程仓库获取的依赖,如某些商业库。

示例:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-lib</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/custom-lib.jar</systemPath>
</dependency>

注意system 依赖不会从 Maven 仓库解析,建议尽量避免使用。


2.6 import(仅用于 dependencyManagement)

特点:

  • 仅用于 dependencyManagement 中,允许引入 BOM(Bill of Materials)。
  • 这种方式用于管理多个依赖的版本,而不会真正引入依赖。

适用场景:

  • 适用于 Spring Boot 等项目中引入官方 BOM。

示例:

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

3. Scope 作用范围总结

Scope编译(Compile)测试(Test)运行(Runtime)典型使用场景
compile(默认)普通依赖,如 Apache Commons
provided运行环境提供的库,如 javax.servlet-api
runtime运行时才需要的库,如 mysql-connector-java
test测试框架,如 JUnit
system本地 jar,如商业库(不推荐)
import仅用于 dependencyManagement

4. 结论

Maven scope 的选择对项目的构建和运行至关重要。合理使用 scope,可以优化项目的依赖管理,提高构建效率。

  • 如果不确定,默认使用 compile
  • 如果依赖运行时由外部提供(如 Web 容器),使用 provided
  • 如果依赖仅在运行时使用,使用 runtime
  • 如果依赖仅用于测试,使用 test
  • 避免使用 system,优先使用远程仓库
  • 使用 import 来管理 BOM,保持依赖版本一致

希望本文能帮助你更好地理解 Maven 依赖范围的用法!

相关文章:

  • 【一文入门】shell语法进阶篇
  • 鸿蒙next 点击穿透实现
  • org.springframework.boot不存在的其中一个解决办法
  • JAVA面试_进阶部分_Linux面试题
  • Idea 中 Project Structure简介
  • java23种设计模式-中介者模式
  • vue打印页面(可分页、可打印echarts、可显示背景色)
  • Qwen 2.5 技术报告解读
  • leetcode151 反转字符串中的单词
  • Spring Boot 中 @Transactional 注解全面解析
  • MySQL中json类型数据查询
  • 线性回归(一)基于Scikit-Learn的简单线性回归
  • DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集
  • 博云先进算力管理平台AIOS已上线全尺寸DeepSeek系列模型
  • 15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]
  • JavaWeb-ServletContext应用域接口
  • Codeforces Round 1006 (Div. 3)(部分题解)
  • 图神经网络:拓扑数据分析的新时代
  • 单点登录原理和JWT实现
  • 算法-图-查找路径
  • 中国体育报关注徐梦桃、王曼昱、盛李豪等获评全国先进工作者:为建设体育强国再立新功
  • 从咖啡节到话剧、演唱会,上海虹口“文旅商体展”联动促消费
  • 俄罗斯延长非法滞留外国人限期离境时间至9月
  • 大家聊中国式现代化|陶希东:打造高水平安全韧性城市,给群众看得见的安全感
  • 玉渊谭天丨中方减少美国农产品进口后,舟山港陆续出现巴西大豆船
  • 图像编辑新增一款开源模型,阶跃星辰发布Step1X-Edit