Maven依赖

1. 依赖的配置

    根元素project下的dependencies可以包含一个或多个dependency元素,以声明一个或多个依赖。每个依赖可以包含的元素有:
groupId、artifactIdversion:依赖的基本坐标,坐标三元素。
type:依赖的类型,对应于项目定义的packaging,大部分情况下不需要定义,使用默认值jar。
scope:依赖的范围。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。

2. 依赖的范围

依赖范围(scope) 对于编译classpath有效 对于测试classpath有效 对于运行时classpath有效
编译依赖范围:compile Y Y Y
测试依赖范围:test - Y -
已提供依赖范围:provided Y Y -
运行时依赖范围:runtime - Y Y
系统依赖范围:system Y Y -

另外还有导入依赖范围:import,该范围不会对三种classpath产生实际的影响。

3. 传递性依赖,和数学里的传递性,是同样的概念。

    当A有一个compile范围的B依赖,B有一个compile范围的C依赖,那么C就会成为A的compile范围依赖,C是A的一个传递性依赖。
    有了传递性依赖的机制,在使用某个依赖时就不需要考虑它依赖了什么,也不需要担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
    需要注意的是,可选依赖不会被传递。

4. 依赖范围影响传递性依赖

  compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

5. 依赖调解

    当两个依赖路径上有两个版本的依赖X时,有以下两个依赖调解原则:
第一原则:路径最近者优先;
第二原则:路径长度一样时,第一声明者优先。

6. 排除依赖

    当项目A依赖于项目B,但是不想引入传递性依赖C,而是自己显示的声明对项目C另一个版本的依赖,使用exclusions元素声明排除性依赖。
    exclusions可以包含一个或者多个exclusion子元素,声明exclusion时只需要groupId和artifactId,不需要version元素。

7. 归类依赖

    当项目中依赖了同一项目的不同模块,它们的版本都是相同的,因此在升级的时候,这些依赖的版本会一起升级。为了避免重复,且需要修改时只修改一处,可以通过归类依赖来解决。
    使用properties元素定义Maven属性,如springframework.version子元素,并定义其值。有了这个属性定义,maven运行时会将POM中所有的${springframwork.version}替换成定义的实际值。

8. 优化依赖

使用dependency:list和dependency:tree 帮助我们详细了解项目中所有依赖的具体信息。
使用dependency:analyze工具可以帮助分析当前项目的依赖。
analyze的结果中包含了两部分:
Used undeclared dependencies:项目中使用但未显式声明的依赖。这种依赖意味着潜在的风险;
Unused declared dependencise:项目中未使用的,但显式声明的依赖。对于这种依赖不能直接删除,因为analyze只会分析编译和测试需要的依赖,其他依赖它无法发现,因此需要仔细分析。

Maven学习九:依赖-dependency相关推荐

  1. Maven学习:依赖管理

    依赖是什么? "依赖是maven项目引用的资源jar包,依赖范围就是这些资源架包在maven项目中的作用范围,反过来说,maven项目通过依赖范围来控制何时引用资源jar包." 关 ...

  2. Maven学习(二) -- 坐标和依赖

    标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...

  3. Maven学习总结(九)——使用Nexus搭建Maven私服

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(九)--使用Nexus搭建Maven私服 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很 ...

  4. Maven学习(五)————依赖的特性辨析

    引言 在Maven 中,依赖有一些特性必须我们掌握,如依赖的传递性. 一.依赖的传递性 其实依赖的传递性非常好理解. 上图,如果 Maven 项目 B 已经依赖了 C ,A 又依赖了 B,那么 A 不 ...

  5. Maven学习(二) -- 坐标和依赖(转自--江湖小妞)

    坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项目. 他们由groupId,  ...

  6. maven学习笔记——尚硅谷

    文章目录 maven学习笔记--尚硅谷 第一章 Maven概述 第一节 为什么要学习Maven 1.Maven 作为依赖管理工具 1.1 jar 包的规模 1.2 jar 包的来源 1.3 jar 包 ...

  7. Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  8. Maven学习总结(四)——Maven核心概念

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平 ...

  9. Maven学习总结(五)——聚合与继承

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1. ...

最新文章

  1. 优化营商环境建议个人_优化营商环境的几点建议(三)
  2. WIKI与BLOG殊途同归(转)
  3. SDE要素类导出为shp格式文件
  4. Flex/Flash Builder里实用但被忽略的编译参数
  5. 本地两台虚拟机构建NFS服务器和客户端
  6. oracle package lock,Oracle 11g下重现library cache lock等待事件
  7. Datalore:用于机器学习可视化的新Web方案!
  8. 数据结构课上笔记12
  9. 怎么两边同时取ln_男生“两边铲光”发型out了?试试这4款吧,剪完清爽又帅气...
  10. Haybale Guessing (POJ-3657)
  11. linux命令封装sh,shell脚本学习之调用脚本将文件打包zip的方法示例
  12. Security+ 学习笔记26 业务连续性
  13. Elasticsearch报错:NodeDisconnectedException[[][IP:9300][cluster:monitor/nodes/liveness] disc
  14. Python弹球游戏(tkinter模块编写)
  15. 风控中英文术语手册(银行_消费金融信贷业务)
  16. kali入侵win7
  17. 系统分析与设计 复习
  18. 深拷⻉浅拷⻉的区别?什么是深拷⻉浅拷⻉
  19. gensim简单使用
  20. <Zhuuu_ZZ>HIVE(九)窗口函数

热门文章

  1. 鸿蒙系统能装CAD吗,64位cad能装到32位的系统上吗
  2. 基于JAVA的免费手机归属地接口查询
  3. 首饰logo创意欣赏 - 设计商标 - logo公司
  4. mysql 存储时间应该是时间戳还是时间_3分钟短文 | MySQL存时间,到底该用timestamp还是datetime?...
  5. c语言||一个函数能return好几个?(产生多个返回值)
  6. Leetcode 584 寻找用户推荐人(SQL)
  7. Type-C接口简单介绍-面向单片机应用
  8. 十二、Hadoop HA集群高可用配置
  9. Windows卡死问题分析
  10. 无人驾驶技术入门(四)| 百度无人车传感器 IMU 深入剖析