Maven(Ⅱ):依赖范围,依赖传递,依赖阻断,可选依赖

embedded/2025/2/6 10:41:03/

1. Maven 依赖范围

概念

依赖范围(Dependency Scope)用于控制依赖在不同构建阶段的可见性和可用性。Maven 定义了几种不同的依赖范围,每种范围都有其特定的使用场景。

常见依赖范围及用途
  • compile:默认的依赖范围,在所有的 classpath 中都可用,并且会传递到依赖的项目中。适用于项目的核心业务代码依赖。
  • provided:该依赖在编译和测试阶段可用,但在运行时由 JDK 或容器提供。例如 Servlet API,在 Tomcat 等容器中已经包含,不需要打包到项目中。
  • runtime:该依赖在运行和测试阶段需要,但在编译阶段不需要。例如 JDBC 驱动,编译时只需要 JDBC 接口,运行时才需要具体的驱动实现。
  • test:该依赖仅在测试编译和运行阶段可用,不会影响项目的正常运行。例如 JUnit 测试框架。
  • system:类似于 provided,但需要显式指定依赖的本地路径。这种方式不推荐使用,因为它破坏了 Maven 的依赖管理机制。
  • import:只能在 <dependencyManagement> 中使用,用于导入其他 pom.xml<dependencyManagement> 部分。
代码示例
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dependency-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- compile 范围 --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- provided 范围 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- runtime 范围 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version><scope>runtime</scope></dependency><!-- test 范围 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>

2. Maven 依赖传递

概念

依赖传递是指当一个项目依赖另一个项目时,被依赖项目的依赖也会自动传递到当前项目中。这可以减少项目 pom.xml 中依赖声明的数量,但也可能导致依赖冲突。

代码示例

假设我们有三个项目:project-aproject-bproject-c

project-bpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>project-b</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency></dependencies>
</project>
project-apom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>project-a</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.example</groupId><artifactId>project-b</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

由于 project-a 依赖 project-b,而 project-b 依赖 commons-lang,所以 commons-lang 会通过依赖传递自动成为 project-a 的依赖。

3. Maven 依赖阻断

概念

依赖阻断是指在依赖传递过程中,通过某种方式阻止某些依赖传递到当前项目中。通常是因为这些依赖会导致冲突或不必要的开销。

代码示例

假设 project-c 依赖 project-b,但不希望 project-bcommons-lang 依赖传递过来。

project-cpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>project-c</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.example</groupId><artifactId>project-b</artifactId><version>1.0-SNAPSHOT</version><!-- 排除 commons-lang 依赖 --><exclusions><exclusion><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId></exclusion></exclusions></dependency></dependencies>
</project>

通过 <exclusions> 标签可以排除传递过来的依赖。

4. Maven 可选依赖

概念

可选依赖(Optional Dependencies)是指在声明依赖时,将其标记为可选。这样,当其他项目依赖当前项目时,这些可选依赖不会自动传递。

代码示例

假设 project-d 依赖 commons-lang,并且将其标记为可选。

project-dpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>project-d</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version><optional>true</optional></dependency></dependencies>
</project>

当其他项目依赖 project-d 时,commons-lang 不会作为传递依赖被引入。如果其他项目需要 commons-lang,则需要显式声明该依赖。


http://www.ppmy.cn/embedded/160000.html

相关文章

【AI知识点】特征编码(Feature Encoding)

特征编码 是将数据集中的分类特征&#xff08;Categorical Features&#xff09;转换为数值特征&#xff08;Numerical Features&#xff09;的过程。分类特征是机器学习模型&#xff08;尤其是数值模型&#xff0c;如线性回归、支持向量机等&#xff09;无法直接处理的数据类型…

图像特征点提取与匹配

引入 视觉里程计根据两帧图像确定机器人的位姿变化。视觉里程计的算法主要分为两个大类&#xff1a;特征点法和直接法。特征点法长久以来&#xff08;直到现在&#xff09;被认为是视觉里程计的主流方法。而特征点法首先需要提取特征点并进行匹配。 1. 特征点 1.1特征点的定义…

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中&#xff0c;异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括&#xff1a; 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

《手札·开源篇》基于开源Odoo软件与Deepseek的智能企业管理系统集成方案

一、方案背景 随着企业数字化转型的深入&#xff0c;传统ERP系统需要结合AI技术实现智能化升级。本方案将开源ERP系统Odoo与深度求索&#xff08;Deepseek&#xff09;大模型能力深度整合&#xff0c;构建具备智能决策支持、自然语言交互和数据分析增强的企业管理平台。 二、…

C++:虚函数与多态性习题

题目内容&#xff1a; 构建一个车&#xff08;vehicle&#xff09;基类&#xff0c;包含Run、Stop两个纯虚函数。由此基类&#xff0c;派生出&#xff08;Car&#xff09;轿车类&#xff0c;&#xff08;truck&#xff09;卡车类&#xff0c;在这两个类中别分定义Run和Stop两个…

【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)

本文目录 一、Hertz中间件Recovery二、Hertz中间件跨资源共享三、Hertz 响应四、Hertz请求五、Hertz中间件Session 一、Hertz中间件Recovery Recovery中间件是Hertz框架预置的中间件&#xff0c;使用server.Default()可以默认注册该中间件&#xff0c;为Hertz框架提供panic回复…

C语言:结构体

一&#xff0c;结构体 C语⾔已经提供了内置类型&#xff0c;如&#xff1a;char、short、int、long、float、double等&#xff0c;但是只有这些内置类型还是不够的&#xff0c;假设我想描述学⽣&#xff0c;描述⼀本书&#xff0c;这时单⼀的内置类型是不⾏的。 描述⼀个学⽣需…