首页 > 其他分享 >maven 的scop 详解

maven 的scop 详解

时间:2024-11-01 12:09:24浏览次数:1  
标签:文件 依赖 boot maven 编译 详解 BOM 版本 scop

在 Maven 中,scope 定义了一个依赖的使用范围,它决定了依赖在编译、测试、运行、打包等阶段的可见性和作用方式。了解这些作用域有助于控制依赖的加载时机和范围,从而优化构建和运行过程。Maven 的 scope 主要有以下几种:

1. compile (默认)

  • 描述compile 是 Maven 中的默认作用域,不指定 scope 的依赖会自动使用 compile 作用域。
  • 使用阶段:编译、测试、运行、打包。
  • 特点:在项目的所有阶段都可用。通常用于项目在运行时和编译时都需要的依赖。
  • 典型场景:项目的核心依赖,比如 Spring FrameworkHibernate 等通常会设为 compile

示例

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.9</version>
    <!-- scope 默认为 compile -->
</dependency>

2. provided

  • 描述provided 表示依赖在编译和测试阶段可用,但在运行时不会打包进最终的构件(如 JAR 或 WAR)。
  • 使用阶段:编译、测试。
  • 特点:运行时需要在外部提供这些依赖,比如应用服务器或运行环境会提供它们。
  • 典型场景:Servlet API、JSP API 等应用服务器或容器内置的库。

示例

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

3. runtime

  • 描述runtime 作用域的依赖仅在运行和测试阶段可用,编译时不可用。
  • 使用阶段:运行、测试。
  • 特点:通常用于运行时才需要的库,编译时不需要。
  • 典型场景:数据库驱动。应用在编译时不需要数据库驱动,但运行时需要。

示例

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

4. test

  • 描述test 作用域的依赖仅在测试阶段可用,编译、运行时不可用。
  • 使用阶段:测试。
  • 特点:用于编写和运行测试时需要的库。
  • 典型场景:JUnit、Mockito 等测试框架或工具。

示例

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

5. system

  • 描述system 作用域的依赖类似于 provided,但需要明确指定依赖文件的路径。它不会从 Maven 仓库中下载,而是直接使用本地系统的文件。
  • 使用阶段:编译、测试。
  • 特点:对文件路径有硬编码,无法与其他机器共享路径信息,不推荐使用。
  • 典型场景:通常不建议使用,可能用于一些本地库或特殊环境下的文件。

示例

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

6. import(仅适用于 <dependencyManagement>

  • 描述import 作用域主要用于导入依赖的 BOM(Bill of Materials)文件,它通常在 <dependencyManagement> 中使用,用于控制和管理子项目的版本一致性。
  • 使用阶段:不直接用于编译或运行,而是用来将依赖版本管理导入到主项目。
  • 典型场景:用于多模块项目或需要版本统一的第三方依赖管理,如 Spring Boot 的 BOM。

示例

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

作用域之间的总结

Scope 编译阶段 测试阶段 运行阶段 打包阶段
compile
provided
runtime
test
system
import - - - -

掌握 Maven 中各个 scope 的用法可以帮助开发者更灵活地管理依赖,在不同阶段启用合适的依赖,提升项目的结构化和构建效率。


Bill of Materials 文件是什么,有什么作用?

BOM(Bill of Materials)文件是 Maven 中一种特殊的 POM 文件,通常用于管理和统一多模块项目或大型项目中依赖的版本。BOM 文件的主要作用是集中管理依赖的版本,从而确保各模块之间的版本一致性,减少冲突,简化依赖管理。

BOM 文件的特点和作用

  1. 依赖版本管理:BOM 文件定义了多种依赖的版本。引入 BOM 文件后,可以在子模块或其他项目中直接使用依赖,而不需要手动指定版本号。

  2. 多模块项目中的一致性:BOM 文件通过在顶层模块统一管理依赖版本,确保了项目中所有模块使用相同的版本,避免了版本冲突和兼容性问题。例如,在一个 Spring Boot 项目中,Spring 提供了 spring-boot-dependencies BOM,保证所有的 Spring 组件版本统一。

  3. 减少重复:通过 BOM 文件的集中管理,子模块可以省去对依赖版本号的配置,从而简化 pom.xml 文件。

BOM 文件的使用

BOM 文件通常在 Maven 项目的 <dependencyManagement> 中使用,并且使用 scope 设置为 import。例如,以下引入了 Spring Boot 的 BOM:

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

引入该 BOM 后,可以直接添加依赖,而无需指定版本:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

BOM 文件的典型应用场景

  • 大型项目的版本统一:对于包含多个子模块的大型项目或微服务项目,BOM 文件可以确保所有服务之间依赖的组件版本一致。
  • 第三方 BOM:许多框架(如 Spring Boot、Apache Camel)提供了官方的 BOM 文件,可以方便地引入,以便在项目中统一框架内的组件版本。
  • 跨项目依赖管理:如果企业内部有多个项目依赖于同一套库和版本,可以创建一个通用的 BOM 文件,供各项目引用。

总结

BOM 文件通过集中管理依赖版本,减少了版本配置的重复性和版本冲突的可能性,提升了项目的维护性和稳定性。在实际开发中,BOM 是多模块和大型项目版本一致性管理的利器。

标签:文件,依赖,boot,maven,编译,详解,BOM,版本,scop
From: https://www.cnblogs.com/gongchengship/p/18519889

相关文章

  • GitLab上怎么创建项目(步骤详解)
    创建项目在GitLab上需经过几个主要步骤:1.注册并登录账户;2.创建新项目;3.初始化及配置项目;4.代码管理与协作;5.持续集成/持续部署(CI/CD)的设置。首步为确保用户拥有一个GitLab账户并成功登录,紧接着便能通过简明的步骤创建并初始化自己的新项目,进而利用GitLab的多样功能进行代码管理和......
  • 聚类算法——Kernel K-Means (核K-均值聚类)聚类算法详解
    KernelK-Means聚类算法详解目录引言聚类算法概述K-Means算法回顾KernelK-Means算法概述KernelK-Means的工作原理核心思想与标准K-Means的区别KernelK-Means的算法步骤初始化计算核矩阵簇分配质心更新迭代与收敛数学基础目标函数核技巧(KernelTrick)特征映......
  • 聚类算法——Spherical K-Means聚类算法详解
    SphericalK-Means聚类算法详解聚类分析是数据挖掘和机器学习中的重要任务之一,其目的是将数据集中的对象分组,使得同一组内的对象相似度高,而不同组之间的对象相似度低。K-Means聚类算法是最经典和最广泛使用的聚类算法之一。然而,K-Means算法在处理高维稀疏数据或基于余弦相......
  • 一文详解精细化工行业持续增长的策略与路径解析
    随着全球经济的快速发展和科技的不断进步,精细化工行业正面临着前所未有的挑战和机遇。在这个过程中,数字化转型已成为推动行业持续增长的关键因素。精细化工行业,作为化学工业的一个重要分支,其产品广泛应用于医药、农药、涂料、香料等多个领域,对提高产品质量、优化生产流程、降低成......
  • STM32--CAN和RS485等半双工形式总线的多设备挂载接法详解
    在工业通信和自动化系统中,CAN总线和RS-485总线是两种常用的半双工通信总线。对于这些总线的多设备挂载接法,通常有两种方式:星型接法和手拉手型接法。本文将详细介绍这两种接法的特点、优缺点以及如何正确接线。星型接法星型接法是指所有设备都连接到一个中心节点,形成放射状......
  • STM32--STM32 微控制器详解
    STM32是STMicroelectronics(意法半导体)推出的一系列基于ARMCortex微控制器家族的产品。它们广泛应用于嵌入式系统领域,因其丰富的特性、低功耗和合理的价格而受到青睐。STM32的特点处理器核心:STM32微控制器基于不同的ARMCortex核心,如Cortex-M0、M3、M4、M7等。存储:包括闪......
  • Python深度学习进阶与前沿应用(注意力机制详解、生成式模型详解、自监督学习模型详解、
    近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型(BERT、GPT-1/2/3/3.5/4、DETR、ViT、SwinTransformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Di......
  • C/C++中的指针详解(重点)
    指针是C和C++中一个重要且强大的特性。它们允许程序员直接访问和操作内存,提供了灵活的内存管理和高效的数据结构实现。对一个变量取*操作其实就是取到这个变量的地址,然后再对取到的变量进行读写等操作以下是对指针的详细介绍:1.什么是指针指针是一个变量,它存储另一个变量的......
  • android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区
    目录一、双缓冲1、概念2、如何使用1、初始化双缓冲2、绘制操作3、交换缓冲区3、优势1、避免屏幕闪烁2、提高渲染效率3、优化资源利用4、注意事项1、内存使用2、交换时间3、同步问题二、默认缓冲1、概念2、如何使用1、渲染操作2、显示操作3、交换缓冲3、注......
  • 汉诺塔问题详解
    汉诺塔游戏规则在一根柱子上从下往上按照大小顺序放置一定数量的圆盘,有三根柱子,把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。该问题可以理解为,先将有圆盘的柱子上的n-1个圆盘放到辅助柱上,再将最......