maven学习系列——(七)Dependency
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>
maven学习系列——(七)Dependency相关推荐
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Pr ...
- (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -& ...
- scrapy爬虫学习系列七:scrapy常见问题解决方案
scrapy爬虫学习系列七:scrapy常见问题解决方案 参考文章: (1)scrapy爬虫学习系列七:scrapy常见问题解决方案 (2)https://www.cnblogs.com/zhaoji ...
- maven学习系列8----将resources目录下的文件打包到jar包外
maven默认情况下会把src/main/resources下的文件和class文件一起打到jar包内部,但是有很多场景下都需要把resources下的文件打包到jar包外面,这样修改resource ...
- Android音视频学习系列(七) — 从0~1开发一款Android端播放器(支持多协议网络拉流本地文件)
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- Vue.js学习系列七——Vue服务器渲染Nuxt学习
我又回来啦~这次我们来学习Vue的服务器渲染SSR. 关于SSR的文章网上很多,一开始看得我云里雾里.然后去Vue.js 服务器渲染指南和nuxt官网看了看,发现文章大多都是搬运官网的内容,真正讲的清 ...
- WorldWind学习系列七:Load/Unload Plugins——投石问路篇
原文转自:http://www.cnblogs.com/wuhenke/archive/2009/12/15/1625102.html 今天原计划把Load/Unload Plugins完全弄明白,可 ...
- Java NIO学习系列七:Path、Files、AsynchronousFileChannel
相对于标准Java IO中通过File来指向文件和目录,Java NIO中提供了更丰富的类来支持对文件和目录的操作,不仅仅支持更多操作,还支持诸如异步读写等特性,本文我们就来学习一些Java NIO提 ...
- STL学习系列七:优先级队列priority_queue容器
1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...
- 吕鑫MFC学习系列七
接着上一节的知识点继续学习MFC的一些重要函数,因为函数设计MFC的基础. 第一步,创建一个MFC工程,然后再将上一节的两个功能添加进来,通过类向导添加DestroyWindow(),第二个按钮通过c ...
最新文章
- JavaScript 设计模式的七大原则(未完成)
- java 判断网络类型_Android 网络类型判断(2g、3g、wifi)及IP地址获取
- 802.11h halow(Short Beacon, s1g beacon)
- Android fingerprint指纹/face人脸代码导读
- 在清理卫生的时候面对奖状和过去的日记本应该怎么处理
- 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】
- bfs理解——hdu6386好题
- [html] 写一个左中右的满屏布局,左右固定220px,中间自适应并且要优先加载
- 一步步实现SDDC-逻辑交换与逻辑路由
- 新浪sea增加php,php接口 连接新浪云sea的mysql数据库
- HTML不刷新,改数据
- linux下关闭acpi电源管理模块
- Linux Ubuntu 安装五笔输入法 ibus-rime 教程
- python选择结构练习(一)
- vue项目使用 Recorder.js 实现录音功能
- 数值分析基础工具使用Matlab绘制双曲线
- matlab单容建模仿真,大学毕业论文-—基于matlab的过程控制系统仿真研究
- 如何通过修改注册表改变系统的默认文件夹
- 用c++语言编写的小程序,利用C++编写一些有趣的小程序
- Git下载和安装步骤