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相关推荐

  1. Maven学习总结(七)——eclipse中使用Maven创建Web项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Pr ...

  2. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -& ...

  3. scrapy爬虫学习系列七:scrapy常见问题解决方案

    scrapy爬虫学习系列七:scrapy常见问题解决方案 参考文章: (1)scrapy爬虫学习系列七:scrapy常见问题解决方案 (2)https://www.cnblogs.com/zhaoji ...

  4. maven学习系列8----将resources目录下的文件打包到jar包外

    maven默认情况下会把src/main/resources下的文件和class文件一起打到jar包内部,但是有很多场景下都需要把resources下的文件打包到jar包外面,这样修改resource ...

  5. Android音视频学习系列(七) — 从0~1开发一款Android端播放器(支持多协议网络拉流本地文件)

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  6. Vue.js学习系列七——Vue服务器渲染Nuxt学习

    我又回来啦~这次我们来学习Vue的服务器渲染SSR. 关于SSR的文章网上很多,一开始看得我云里雾里.然后去Vue.js 服务器渲染指南和nuxt官网看了看,发现文章大多都是搬运官网的内容,真正讲的清 ...

  7. WorldWind学习系列七:Load/Unload Plugins——投石问路篇

    原文转自:http://www.cnblogs.com/wuhenke/archive/2009/12/15/1625102.html 今天原计划把Load/Unload Plugins完全弄明白,可 ...

  8. Java NIO学习系列七:Path、Files、AsynchronousFileChannel

    相对于标准Java IO中通过File来指向文件和目录,Java NIO中提供了更丰富的类来支持对文件和目录的操作,不仅仅支持更多操作,还支持诸如异步读写等特性,本文我们就来学习一些Java NIO提 ...

  9. STL学习系列七:优先级队列priority_queue容器

    1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...

  10. 吕鑫MFC学习系列七

    接着上一节的知识点继续学习MFC的一些重要函数,因为函数设计MFC的基础. 第一步,创建一个MFC工程,然后再将上一节的两个功能添加进来,通过类向导添加DestroyWindow(),第二个按钮通过c ...

最新文章

  1. JavaScript 设计模式的七大原则(未完成)
  2. java 判断网络类型_Android 网络类型判断(2g、3g、wifi)及IP地址获取
  3. 802.11h halow(Short Beacon, s1g beacon)
  4. Android fingerprint指纹/face人脸代码导读
  5. 在清理卫生的时候面对奖状和过去的日记本应该怎么处理
  6. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】
  7. bfs理解——hdu6386好题
  8. [html] 写一个左中右的满屏布局,左右固定220px,中间自适应并且要优先加载
  9. 一步步实现SDDC-逻辑交换与逻辑路由
  10. 新浪sea增加php,php接口 连接新浪云sea的mysql数据库
  11. HTML不刷新,改数据
  12. linux下关闭acpi电源管理模块
  13. Linux Ubuntu 安装五笔输入法 ibus-rime 教程
  14. python选择结构练习(一)
  15. vue项目使用 Recorder.js 实现录音功能
  16. 数值分析基础工具使用Matlab绘制双曲线
  17. matlab单容建模仿真,大学毕业论文-—基于matlab的过程控制系统仿真研究
  18. 如何通过修改注册表改变系统的默认文件夹
  19. 用c++语言编写的小程序,利用C++编写一些有趣的小程序
  20. Git下载和安装步骤

热门文章

  1. CAD填充技巧:填充图案
  2. 批量将RGBA图片转换成RGB格式
  3. 《大数据之路:阿里巴巴大数据实践》-第1章 总述
  4. webstorm使用指南
  5. HDFView 把 JPG 图片转换成 HDF5 格式文件
  6. 迅雷远程服务器连接失败是什么原因,迅雷远程页面常见错误码及处理.docx
  7. SQL-92标准 中文翻译
  8. 来自大数据的反思:需要你读懂的10个小故事
  9. 支持Win7的星号密码查看器的实现
  10. 软考 系统架构设计师考试大纲