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

这篇具有很好参考价值的文章主要介绍了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

maven依赖覆盖,maven,maven,junit,单元测试

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


间接依赖

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

maven依赖覆盖,maven,maven,junit,单元测试

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


依赖冲突

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

路径优先

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

maven依赖覆盖,maven,maven,junit,单元测试

我们在项目中同时引入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>

maven依赖覆盖,maven,maven,junit,单元测试

可以发现,根据路径优先原则,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的版本

maven依赖覆盖,maven,maven,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>

maven依赖覆盖,maven,maven,junit,单元测试

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


特殊依赖

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

        <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

maven依赖覆盖,maven,maven,junit,单元测试

这样写idea会给出提示

maven依赖覆盖,maven,maven,junit,单元测试


可选依赖

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

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

maven依赖覆盖,maven,maven,junit,单元测试

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

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

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

maven依赖覆盖,maven,maven,junit,单元测试

如果我们不想让其他项目引用某个依赖,我们可以使用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依赖了

maven依赖覆盖,maven,maven,junit,单元测试


排除依赖

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

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

maven依赖覆盖,maven,maven,junit,单元测试

如果我们就是不想引入这个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

maven依赖覆盖,maven,maven,junit,单元测试

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


可选依赖和排除依赖区别

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


依赖范围

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

maven依赖覆盖,maven,maven,junit,单元测试
下面就列举了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的依赖传递规则,出现冲突的一些处理等,具体可以参考官方文档文章来源地址https://www.toymoban.com/news/detail-668525.html

到了这里,关于maven依赖管理(依赖配置、依赖传递、依赖冲突、依赖范围)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven 依赖传递和冲突、继承和聚合

    1.1.1 概念         假如有三个 Maven 项目 A 、 B 和 C ,其中项目 A  依赖 B ,项目 B  依赖 C 。那么我们可以说 A 依赖 C 。也就是说,依赖的关系为: A—B—C , 那么我们执行项目 A 时,会自动把 B 和 C 都下载导入到 A 项目的 jar 包文件夹中,这就是依赖的传递性。 1.1.2 作

    2024年01月21日
    浏览(36)
  • 聊聊Maven的依赖传递、依赖管理、依赖作用域

    在Maven中,依赖是会传递的,假如在业务项目中引入了 spring-boot-starter-web 依赖: 那么业务项目不仅直接引入了 spring-boot-starter-web 依赖,还间接引入了 spring-boot-starter-web 的依赖项: spring-boot-starter 、 spring-boot-starter-json 、 spring-boot-starter-tomcat 、 spring-web 、 spring-webmvc 。 Maven依

    2024年02月08日
    浏览(30)
  • 【Maven】依赖管理—导入jar包的三种方式、依赖范围设置

    一、使用坐标导入 jar 包  二、使用坐标导入 jar 包 – 快捷方式  三、使用坐标导入 jar 包 – 自动导入  四、依赖范围 1、在 pom.xml 中编写 dependencies 标签 2、在 dependencies 标签中 使用 dependency 引入坐标 3、定义坐标的 groupId,artifactId,version 4、点击刷新按钮,使坐标生效 1、

    2024年02月16日
    浏览(39)
  • JAVA (MAVEN项目)添加JUnit依赖配置(亲测有效)

    本教程针对Maven项目,Spring Boot或者微服务平台都适用。(亲测有效) File--Seetings--Plugins 安装JUnit和JUnitGenerator V2.0   1、双击选择要测试的类,使用快捷键ctrl+shift+t 2、选择JUnit创建测试类 3、项目运行(右键run或者debug模式运行)   1、新建class,手动添加@Test注解,右键run运行

    2023年04月20日
    浏览(70)
  • maven的依赖范围scope使用

    标签的位置:dependencies/dependency/scope 标签的可选值:compile/test/provided/system/runtime/import #①compile 和 test 对比 main目录(空间) test目录(空间) 开发过程(时间) 部署到服务器(时间) compile 有效 有效 有效 有效 test 无效 有效 有效 无效 #②compile 和 provided 对比 main目录(空间

    2024年02月10日
    浏览(33)
  • 【Maven】如何发现,定位,解决依赖冲突

    运行的时候可能报出错误xx类找不到xx方法,xx类找不到,很有可能就是冲突导致的。 idea安装插件,maven helper 比如我有两个依赖,guava和findbug。 他们都用到了jsr305,但是我依赖的版本不同。可以进入pom文件点击下面的通过Dependency Anazlyer来查看冲突。 可以打印出依赖关系树

    2024年02月11日
    浏览(30)
  • 如何定位、解决maven依赖冲突问题

    目录 1.依赖冲突的原因 2.复现一个依赖冲突场景 3.如何定位依赖冲突 3.1.maven show dependencies 3.2.maven helper 4.依赖路径最短优先原则 如果maven项目中,A依赖于B和C,B依赖于1.0版本的D,C依赖于2.0版本的D,这时候就会出现依赖冲突。   在A上加载使用D依赖的时候,maven会根据 依赖路

    2024年02月10日
    浏览(39)
  • Maven 3-Maven依赖版本冲突的分析及解决小结

    举例 A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过scope等若干种方式控制传递依赖)。 这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖

    2024年02月03日
    浏览(48)
  • maven依赖jar包时版本冲突的解决

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。 直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。 传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解

    2024年02月03日
    浏览(53)
  • Java~在maven项目中添加junit依赖实现单元测试(@After

    在main目录下新建一个test目录, 并将它设置为Test Sources Root 实现 在pom.xml中导入依赖 下载单元测试的插件 3. 双击选择你要测试的类, 使用快捷键ctrl+shift+t 4. 点击create, 然后更改如下画面junit4, 选中你要测试的方法, 单元测试的生成类默认保存在test目录下 5. 进入生成的测试类就可

    2024年04月27日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包