maven 中 <scope> 的作用

在 Maven 中,<scope> 标签用于指定依赖的作用范围,控制依赖在项目的不同构建阶段(如编译、测试、运行、打包)中的可见性和行为。Maven 定义了以下几种主要的依赖范围(scope):

  1. compile
  2. provided
  3. runtime
  4. test
  5. system
  6. import

1. <scope>compile</scope>

  • 默认范围 :如果未指定 scope,默认为 compile
  • 编译时可用:依赖在编译、测试和运行时都可用。
  • 打包时包含:依赖会被打包到最终的可执行文件(如 JAR、WAR)中。
xml 复制代码
<dependency>
    <groupId>org.example</groupId>
    <artifactId>example-lib</artifactId>
    <version>1.0.0</version>
    <scope>compile</scope>
</dependency>

2. <scope>provided</scope>

  • 编译时可用:依赖在编译时可用。
  • 运行时不可用:依赖在运行时不包含在最终的包中,需要由运行环境提供。
  • 典型用途:用于依赖由容器或应用服务器提供的库,如 Servlet API。
xml 复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

3. <scope>runtime</scope>

  • 运行时可用:依赖在运行和测试时可用。
  • 编译时不可用:依赖在编译时不可用。
  • 典型用途:用于仅在运行时需要的库,如 JDBC 驱动。
xml 复制代码
<dependency>
    <groupId>org.example</groupId>
    <artifactId>example-lib-runtime</artifactId>
    <version>1.0.0</version>
    <scope>runtime</scope>
</dependency>

4. <scope>test</scope>

  • 测试时可用:依赖仅在测试编译和测试运行时可用。
  • 编译和运行时不可用:依赖在主代码编译和运行时不可用。
  • 典型用途:用于测试框架和库,如 JUnit、Mockito。
xml 复制代码
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
</dependency>

5. <scope>system</scope>

  • 类似 provided :类似于 provided,但依赖必须手动提供路径。
  • 必须指定路径 :需要在 <systemPath> 元素中指定依赖的路径。
  • 典型用途:用于本地系统特有的库,不推荐使用。
xml 复制代码
<dependency>
    <groupId>org.example</groupId>
    <artifactId>example-lib-system</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/example-lib-system-1.0.0.jar</systemPath>
</dependency>

6. <scope>import</scope>

  • 导入依赖管理 :用于在 <dependencyManagement> 部分中导入 BOM(Bill of Materials)。
  • 仅在 <dependencyManagement> 中使用:允许项目继承和管理依赖版本。
xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>example-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

总结

Maven 中的 <scope> 标签通过指定依赖的作用范围,帮助开发者更精细地控制依赖在项目的各个阶段中的可见性和行为,从而优化构建过程,提高项目的组织和管理效率。

相关推荐
maomao大哥闯天下21 小时前
K8s对象deployment、job、service应用详解
java·容器·kubernetes
闪电悠米21 小时前
黑马点评-优惠券秒杀-05_local_lock_cluster_problem
java·spring boot·redis·缓存
IronMurphy21 小时前
SSM拷打第二讲!!!
java·spring·mybatis
小江的记录本21 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
千纸鹤の脉搏1 天前
多线程的初步了解---进程与线程
java·开发语言·学习·线程
许彰午1 天前
状态模式实战——Row对象的状态机
java·ui·状态模式
搬石头的马农1 天前
Claude Code SpringBoot开发:从0到1搭建企业级项目的6个核心Skill
java·人工智能·spring boot·后端·ai编程
西安邮电大学1 天前
Redis为什么快?
java·redis·后端·其他·面试
折哥的程序人生 · 物流技术专研1 天前
《Java 100 天进阶之路》第39篇:Java泛型方法的定义和使用
java·开发语言·后端·面试·求职招聘
土狗TuGou1 天前
SQL内功笔记 · 第6篇:窗口函数的使用ROW_NUMBER等
java·数据库·后端·sql·mysql