maven依赖管理(依赖配置、依赖传递、依赖冲突、依赖范围)

基本说明

这篇文章会介绍在maven中的依赖配置、依赖传递、依赖范围等知识点。


依赖配置

依赖配置很好理解,就是指当前项目需要什么jar,就在dependencies中进行配置

    <dependencies>
        <dependency>
            <!-- 组织名 -->
            <groupId>junit</groupId>
            <!-- 项目名 -->
            <artifactId>junit</artifactId>
            <!-- 版本号 -->
            <version>4.13.2</version>
        </dependency>
    </dependencies>

依赖传递

在maven管理jar的时候,冲突是肯定存在的,这里就来介绍一下在maven中对于jar的一些管理是如何进行的,遵循什么规则。


直接依赖

简单说就是我们在A项目中引入了B,那么就称A直接依赖于B

在这里插入图片描述

这个项目中引入了junit,那么改项目就直接依赖于junit


间接依赖

如果项目A依赖于项目B,而项目B又依赖于项目C,我们就称项目A间接依赖于项目C

在这里插入图片描述

当前项目依赖于junit,junit又依赖于hamcrest-core,所以当前项目就间接依赖于hamcrest-core


依赖冲突

当我们引入了A和B,A项目中又引入B,那么这时项目中就有了2个B,于是就会产生依赖冲突,当然还有其他很多情况也会产生依赖冲突。这里就是说明一些依赖冲突时的优先原则。

路径优先

当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高

在这里插入图片描述

我们在项目中同时引入junit和hamcrest-core来测试一下

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>2.2</version>
        </dependency>

在这里插入图片描述

可以发现,根据路径优先原则,junit引入的hamcrest-core就被覆盖掉了


声明优先

当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的

我创建了2个maven模块,都引入了junit,只不过是不同的版本,现在来测试一下

        <dependency>
            <groupId>com.ttpfx</groupId>
            <artifactId>maven2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.ttpfx</groupId>
            <artifactId>maven3</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

我同时引入了自己创建的2个模块,现在来看看junit的版本

在这里插入图片描述

由于maven2在前面,所以就是引入的junit 4.13.2

现在讲maven3放在前面再来进行测试

        <dependency>
            <groupId>com.ttpfx</groupId>
            <artifactId>maven3</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.ttpfx</groupId>
            <artifactId>maven2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

在这里插入图片描述

可以发现再相同层级的时候,就是顺序靠前的覆盖配置顺序靠后的


特殊依赖

当同级配置了相同资源的不同版本(没有意义的配置),后配置的覆盖先配置的

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

上面这样配置,此时引入的junit版本为4,11

在这里插入图片描述

这样写idea会给出提示

在这里插入图片描述


可选依赖

可选依赖指对外隐藏当前所依赖的资源,也就是只有当前项目可以使用

下面我创建了一个模块 maven4,引入了2个jar

在这里插入图片描述

现在我再另外一个模块maven1引入了前面创建的模块 maven4。

        <dependency>
            <groupId>com.ttpfx</groupId>
            <artifactId>maven4</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

此时maven1就会同时引入maven4的2个依赖

在这里插入图片描述

如果我们不想让其他项目引用某个依赖,我们可以使用option来进行指定

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- 默认为false,如果指定为ture,那么改依赖不会进行依赖传递,即隐藏 -->
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

我们吧maven4中的junit的option设置为了true,那么再maven1中就不会有junit依赖了

在这里插入图片描述


排除依赖

排除依赖指主动排除依赖的资源, 被排除的资源无需指定版本。

我们知道,当我们引入junit的时候会间接引入一个hamcrest-core

在这里插入图片描述

如果我们就是不想引入这个jar,那么就可以使用exclusions来进行排除

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <exclusions>
                <!-- 可以有多个exclusion -->
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

这样我们就可以排除掉hamcrest-core

在这里插入图片描述

此时项目中就没有hamcrest-core了(当然,此时使用junit会报错,因为junit依赖于hamcrest-core)


可选依赖和排除依赖区别

简单说就是: 可选(隐藏)依赖是不让其他项目来引用(我不给), 排除依赖是主动不要引入的某个资源(我不要)


依赖范围

我们可以通过scope来指定依赖作用范围,作用范围有compile(默认)、test、provided、runtime。它们的作用范围如下:

在这里插入图片描述
下面就列举了2个常见的情形

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- 只用于测试 -->
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <!-- 不会参与打包 -->
            <scope>provided</scope>
        </dependency>

还需要说明的是,主代码表示 src/main 文件夹下的代码,测试代码表示 src/test 目录下面的代码


总结

在这篇文章中介绍了maven中的一些基础概念,maven的依赖传递规则,出现冲突的一些处理等,具体可以参考官方文档

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Maven权威指南 Authors Tim O'Brien (Sonatype, Inc.) , John Casey (Sonatype, Inc.) , Brian Fox (Sonatype, Inc.) , Bruce Snyder () , Jason Van Zyl (Sonatype, Inc.) , Juven Xu () Abstract Maven权威指南是一本关于Apache Maven的书。 Copyright 1. Creative Commons BY-ND-NC Foreword: Beta 0.16 Preface 1. How to Use this Book 2. Your Feedback 3. Font Conventions 4. Maven Writing Conventions 5. Acknowledgements 1. 介绍 Apache Maven 1.1. Maven... 它是什么? 1.2. 约定优于配置(Convention Over Configuration) 1.3. 一个一般的接口 1.4. 基于Maven插件的全局性重用 1.5. 一个“项目”的概念模型 1.6. Maven是Ant的另一种选择么? 1.7. 比较Maven和Ant 1.8. 总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装Maven 2.3.3. 在Linux上安装Maven 2.3.4. 在FreeBSD或OpenBSD上安装Maven 2.4. 验证Maven安装 2.5. Maven安装细节 2.5.1. 用户相关配置和仓库 2.5.2. 升级Maven 2.6. 获得Maven帮助 2.7. 使用Maven Help插件 2.7.1. 描述一个Maven插件 2.8. 关于Apache软件许可证 I. Maven实战 3. 一个简单的Maven项目 3.1. 简介 3.1.1. 下载本章的例子 3.2. 创建一个简单的项目 3.3. 构建一个简单的项目 3.4. 简单的项目对象模型 (Project Object Model) 3.5. 核心概念 3.5.1. Maven插件和目标 (Plugins and Goals) 3.5.2. Maven生命周期 (Lifecycle) 3.5.3. Maven坐标 (Coordinates) 3.5.4. Maven仓库(Repositories) 3.5.5. Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1. Yahoo! Weather RSS 4.3. 创建Simple Weather项目 4.4. 定制项目信息 4.5. 添加新的依赖 4.6. Simple Weather源码 4.7. 添加资源 4.8. 运行Simple Weather项目 4.8.1. Maven Exec 插件 4.8.2. 浏览你的项目依赖 4.9. 编写单元测试 4.10. 添加测试范围依赖 4.11. 添加单元测试资源 4.12. 执行单元测试 4.12.1. 忽略测试失败

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头披风侠.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值