大家好,又见面了,我是全栈君。
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>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121066.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...