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

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

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.kler.cn/a/532675.html

相关文章:

  • AI大模型(二)基于Deepseek搭建本地可视化交互UI
  • 扩展域并查集 带权并查集
  • MATLAB中textBoundary函数用法
  • 【高级篇 / IPv6】(7.2) ❀ 05. 在60E上配置ADSL拨号宽带上网(IPv6) ❀ FortiGate 防火墙
  • kamailio-ACC_JSON模块详解【后端语言go】
  • 数据思维错题知识点整理(复习)
  • 10分钟本地部署Deepseek-R1
  • Laravel Validation validated() 的实现
  • Selenium记录RPA初阶 - 基本输入元件
  • js --- 获取随机数
  • 预防和应对DDoS的方法
  • 【力扣】283.移动零
  • springboot后台系统开发(三)- 日志
  • 【OS】AUTOSAR架构下的Interrupt详解(上篇)
  • 某某音乐歌单下载(电脑)
  • 物联网领域的MQTT协议,优势和应用场景
  • spark君第一篇图文讲解Delta源码和实践的文章
  • C基础寒假练习(8)
  • ioDraw桌面版 v3.4.0发布!AI文生图,AI图生图,手绘风格一键转换!
  • 37、【OS】【Nuttx】OSTest分析(2):任务创建
  • 深入探索Vue 3组合式API
  • 实例研究:设计一个文档编辑器(1)
  • 有用的sql链接
  • 调用DeepSeek API实现对本地数据库的AI管理
  • 手扶电梯缺陷检测数据集VOC+YOLO格式67张1类别
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.19 线性代数核武器:BLAS/LAPACK深度集成