maven学习系列——(七)Dependency

Dependency介绍本文转自:Maven简介(六)——Dependency,并加上自己在实际使用中的总结和说明!1、依赖的传递性依赖传递对版本的选择假设A依赖于B和C,然后B依赖于D,D又依赖于E1.0,C直接依赖于E2.0,那么这个时候A依赖的是E1.0还是E2.0,还是这两个都依赖呢?两个都依赖是肯定不行的,因为它们可能会有冲突的地方。这个时候就涉及到Maven中依赖传递对…

大家好,又见面了,我是全栈君。

Dependency介绍

本文转自:Maven简介(六)——Dependency,并加上自己在实际使用中的总结和说明!

1、依赖的传递性

依赖传递对版本的选择

假设A依赖于B和C,然后B依赖于D,D又依赖于E1.0,C直接依赖于E2.0,那么这个时候A依赖的是E1.0还是E2.0,还是这两个都依赖呢?两个都依赖是肯定不行的,因为它们可能会有冲突的地方。这个时候就涉及到Maven中依赖传递对版本的选择问题。依赖传递在选择版本的时候首先是根据深度选择的。当一个项目同时经过不同的路径依赖于同一个组件时,会选择其深度最短的对应组件进行依赖。

举例来说:
第一种情况:

  • A->B->C->D1.0
  • A->E->D2.0

那么这个时候A就会选择对D 相对路径短 的组件来进行依赖,也就是D2.0。

那么当深度一样的时候Maven会如何选择呢?

  • A->B->D1.0
  • A->C->D2.0

这个时候Maven会如何选择A所依赖的D的版本呢?

这种情况Maven会根据申明的依赖顺序来进行选择,先申明的会被作为依赖包。像前面这种情况,如果先申明对B的依赖,则A依赖的就是D1.0;如果先申明对C的依赖,则A依赖的就是D2.0。

总结:
1、路径相同的情况,会根据申明的依赖顺序来进行选择,先申明的会被作为依赖包。
2、路径不同的情况,采用 深度最短的对应组件进行依赖。

使用exclusion排除依赖

假设有这样一种依赖关系,A->B->C,这个时候由于某些原因,我们不需要对C的依赖,但是我们又必须要对B的依赖,这个时候该怎么办呢?针对这种情况,Maven给我们提供了一个exclusion功能,我们可以在添加A对B的依赖时申明不需要引进B对C的依赖。具体做法如下:

<dependencies>  
       <dependency>  
              <groupId>groupB</groupId>  
              <artifactId>artifactB</artifactId>  
              <version>1.0</version>  
              <exclusions>  
                     <exclusion>  
                            <groupId>groupC</groupId>  
                            <artifactId>artifactC</artifactId>  
                     </exclusion>  
              </exclusions>  
       </dependency>  
       ...  
</dependencies>  

总结:
exclusions: 在实际项目中使用的还是比较多,可以解决:
1、依赖传递问题
2、版本冲突问题

2、 依赖项的作用域

test:表示该依赖项只对测试时有用,包括测试代码的编译和运行,对于正常的项目运行是没有影响的。
比如:Junit jar、Spring-test jar

provided:表示该依赖项将由JDK或者运行容器在运行时提供,也就是说由Maven提供的该依赖项我们只有在编译和测试时才会用到,而在运行时将由JDK或者运行容器提供
比如:servlet-api jar

compile:这是依赖项的默认作用范围,即当没有指定依赖项的scope时默认使用compile。compile范围内的依赖项在所有情况下都是有效的,包括运行、测试和编译时。

runtime:表示该依赖项只有在运行时才是需要的,在编译的时候不需要。这种类型的依赖项将在运行和test的类路径下可以访问。
比如:mysql-connector-java jar

3、dependencyManagement介绍

使用的配置如下:

<project>  
       ...  
       <dependencyManagement>  
              <dependencies>  
                     <dependency>  
                            <groupId>groupC</groupId>  
                            <artifactId>artifactC</artifactId>  
                            <version>1.0</version>  
                     </dependency>  
                     <dependency>  
                            <groupId>groupD</groupId>  
                            <artifactId>artifactD</artifactId>  
                            <version>1.0</version>  
                     </dependency>  
                     <dependency>  
                            <groupId>groupE</groupId>  
                            <artifactId>artifactE</artifactId>  
                            <version>1.0</version>  
                            <type>bar</type>  
                     </dependency>  
              </dependencies>  
       </dependencyManagement>  
       ...  
</project>


总结:
1、集中管理依赖项和依赖项使用的版本进行统一管理。
2、子项目需要直接引用才有能引入自己需要的依赖包,不需要在写版本号!
3、开源项目中使用较多,这个在大型项目或者jar依赖较多的项目必须使用!!!一定要学会使用方法。

子项目使用方法:

<dependencies>  
  <dependency>  
             <groupId>groupC</groupId>  
             <artifactId>artifactC</artifactId>  
             <!-- 不需要指定版本,会依赖父类统一管理版本-->
     </dependency>  
</dependencies>  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121066.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 苹果x充电慢是什么原因_iPhone 12支持15W MagSafe无线充电,未来苹果手机的充电会发生什么?_充电器…

    2020-10-2122:44:400点赞0收藏0评论2020年由于一些特殊的原因导致一切似乎都和平时不一样了,所有的发布会都改成了线上,而备受关注的苹果也将发布会转移到了线上并采用录播的形式播出,从WWDC2020开始,我们就看到了一个不一样的线上发布会。众所周知,每年的秋季苹果都会发布新iPhone。在2020年9月份的苹果发布会上我们只见到了新iPad和新的AppleWatch发布,有且…

    2022年4月7日
  • python读取图片名称_照片文件名怎么改jpg

    python读取图片名称_照片文件名怎么改jpgPython读取文件夹下的.jpg图片,提取图片的文件名。最近做的图像处理,需要读取文件夹下所有图片和对应的文件名,进行相关处理,最后保存的图片要求文件的名称与原图名称一致。百度找了好多例子也没找到,最后零零碎碎的搜索,通过一些个人的思考把相关的知识点和程序结合,总算做出来了。举个简单的功能:读取文件夹下的图片和对应的图片名,先处理成灰度图像,再进行保存,要求保存的图片的名称与原图名称一致。效果如下:读取F:\image下的000~004.jpg,最后处理的灰度图片保存在F:\image\sa

    2022年9月3日
  • iOS charles 抓包使用[通俗易懂]

    iOS charles 抓包使用[通俗易懂]参考链接:Charles抓包使用教程-MAC-黒貓-博客园部分APP无法代理抓包的原因及解决方法(flutter抓包)-lulianqi15-博客园建议最好从官网下载应用,1个月免费使用,可以使用注册码来激活,链接如下:DownloadaFreeTrialofCharles•CharlesWebDebuggingProxycharles连接手机可以参考链接1,非常详细,珠玉在前,不在赘述;*****连接步骤简述*****下载c.

    2022年6月7日
  • Verilog设计实例(6)基于Verilog的各种移位寄存器实现「建议收藏」

    Verilog设计实例(6)基于Verilog的各种移位寄存器实现「建议收藏」在数字电子产品中,移位寄存器是级联的触发器,其中一个触发器的输出引脚q连接到下一个触发器的数据输入引脚(d)。因为所有触发器都在同一时钟上工作,所以存储在移位寄存器中的位阵列将移位一个位置。

    2022年7月16日
  • A4988与42步进电机

    A4988与42步进电机A4988电机驱动板引脚VMOT:电源正(8~35V),供电机GND:电机接地2B,2A:电机绕组2控制引脚1A.1B:电机绕组1控制引脚VDD:驱动板电源正(3~5V)GND:驱动板地ENABLE:引脚低电平,A4988才能进行电机驱动工作(悬空为默认状态,可以正常工作),高电平,A4988将不会经行电机驱动工作MS1,MS2,MS3:用来改变驱动模式具体如图REST:低电平…

    2022年6月15日
  • spring SpEL

    spring SpEL

    2021年12月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号