Maven专题1——坐标与依赖
1. 坐标
坐标用来唯一定位一个Maven构件:
- GAV(必需):groupId, artifactId, version
- packaging(可选): 可取值如:
jar
(缺省),war
,pom
,maven-plugin
等,其中父项目的packaging
通常是pom
,只用来声明项目元数据,用到的依赖、插件,以及项目中的子模块等。 - classifier: 不能直接定义,通常用来辅助定义附属构件,如:javadoc、sources构件等。
2. 依赖
在POM的<dependency>
元素中,有以下元素可以用来配置依赖:
GAV:groupId、artifactId、version。
type:对应于被依赖模块的
packaging
元素的值,默认是jar
。scope:
- compile:默认依赖范围,对编译、测试、运行三种classpath都有效,用于编译、测试、运行阶段都需要用到的依赖;
- test:只对测试classpath有效,编译主代码、运行项目时无法使用的依赖。
- provided:对编译、测试有效,在运行时无效。
- runtime:运行时依赖,对测试、运行classpath有效,在编译主代码时无效;
- import:不会对编译、测试、运行的classpath产生实际影响,
- system:需通过systemPath显式指定依赖的路径,不通过Maven仓库解析,会造成构建的不可移植,不推荐使用。
optional:标记依赖是否可选;
exclusions:
dependency.exclusions
元素用来排除某些传递依赖,通常用来排除传递进来的不合适版本的依赖或根本不需要的依赖。
2.1 管理type
为pom
类型的依赖
通常一个项目的pom
类型的构件用来声明使用到的依赖,为了沿用和管理其声明的所有依赖,通常可以在dependencyManagement
元素中如下引用:
<dependencyManagement>
<dependencies>
<dependency>
<artifactId>org.springframework.boot</artifactId>
<groupId>spring-boot-dependencies</groupId>
<version>${spring.boot.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
以此来保持我们项目使用的依赖和Spring Boot声明的一致。
2.2 依赖范围与classpath关系
依赖范围 | 对编译classpath有效 | 对测试classpath有效 | 对运行时classpath有效 | 示例 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
test | - | Y | - | JUnit |
system | Y | Y | - | 本地Maven仓库以外的类库文件 |
2.3 依赖范围与依赖传递的关系
- | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
表格说明:
- 最左侧列是第一直接依赖,如A依赖于B,B依赖于C时,A对于B即是第1直接依赖;
- 最上侧行是第2直接依赖,如A依赖于B,B依赖于C时,B对于C即是第2直接依赖;
- 表中其他单元格表示传递依赖的依赖范围,即A传递依赖C的范围。
结论:
- 第2直接依赖的范围是
compile
时,传递依赖的范围与第1直接依赖一致; - 第2直接依赖是
test
时,依赖不会传递; - 第2直接依赖是
provided
时,只传递依赖第1直接依赖也是provided
范围的依赖。
3. 依赖调解
- 路径最近者优先,例如:A->B->c->x(1.0),a->d->x(2.0),由于a通过第二条路径依赖x的距离更短,因此实际解析使用的是2.0的x。
- 最先声明者优先,例如:a->b->y(1.0),a->c->y(2.0),在依赖路径等长时,声明依赖b在声明c之前,则实际解析使用的是y(1.0)。
4. 可选依赖
optional
元素是true
的依赖是可选依赖。
可选依赖通常用来阻断依赖传递,例如a->b,b->x(可选)、b->y(可选)。
这种情况通常出现在b有多种实现,一种可以使用x,另一种可以使用y的场景。
此时考虑非可选的场景,如果上述3个依赖范围都是compile
,那么x和y也应该是a的compile
依赖。
然而在可选依赖的场景下,依赖传递被打破,x和y只会对声明可选依赖于他们的b有影响,a并不会传递依赖x和y。
当声明a依赖于b时,就要指明a选择使用b依赖的x还是y,即需要在a中显式的声明依赖x或y。
对于存在可选依赖的场景,应考虑针对每一种可选依赖建立一个独立的模块对外提供功能,从而不使用可选依赖这个概念。
5. 优化依赖
使用列表的形式查看依赖:
mvn dependency:list
使用树形结构查看依赖树:
mvn dependency:tree
分析依赖状况:
mvn dependency:analyze
analyze
会列出两类重点关注的依赖:
- 使用但未声明的依赖:指项目中使用到,但是是通过传递依赖传递进来的。
- 声明但未使用的依赖:项目中声明了但未使用的依赖,该命令只列出编译主代码、测试代码需要的依赖,并不会发现执行测试和运行时需要的依赖,所以不应该简单地删除声明了但未使用的依赖。
Maven专题1——坐标与依赖的更多相关文章
- Maven学习笔记—坐标和依赖
Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...
- maven学习(九)——maven中的坐标、依赖以及仓库
一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...
- maven入门-- part4 坐标和依赖
Maven的坐标为各种构件引入了秩序,任何一个构件都必须明确的定义自己的坐标,maven的坐标包括如下的元素: groupId: 定义当前Maven项目隶属的实际项目 artifactId: 该元素定 ...
- Maven学习(二) -- 坐标和依赖
标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...
- Maven之——坐标和依赖(上)
Maven之--坐标和依赖(上) 1. Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到详细的构件.Maven的坐标元素包含groupId.artifactId.versi ...
- 3.Maven坐标和依赖
1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标 ...
- 【Maven】---坐标与依赖
Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在 ...
- Maven入门指南③:坐标和依赖
1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可 ...
- 03 Maven 坐标与依赖
Maven 坐标与依赖 Maven 的一大功能是管理项目依赖.为了能自动化地解析任何一个 Java 构件, Maven 就必须将它们唯一标识,这就依赖管理的底层基础 一一 坐标.本章将详细分析 Mav ...
随机推荐
- java使用Selenium操作谷歌浏览器学习笔记(三)键盘操作
我们用Selenium打开网页后,可能需要在输入框输入一些内容等等,这时候就需要键盘操作了 使用sendKEys进行键盘操作,在bing的搜索框中输入内容并点击跳转 1 import org.open ...
- 『Java』String类使用方法
Java中的字符串 java.lang.String类表示字符串类,Java程序中所有字符串文字都可以看作实现该类的实例. 特点: 字符串不可变:字符串的值在创建后不能在发生改变 public cla ...
- javaScript学习关于常用注册监听和对象的创建
JS 中的自定义对象(扩展内容) Object 形式的自定义对象 对象的定义: ...
- Java基础技术多线程与并发面试【笔记】
Java基础技术多线程与并发 什么是线程死锁? 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...
- DVWA-全等级文件上传
DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...
- NOIP 模拟 $31\; \rm Cover$
题解 \(by\;zj\varphi\) 因为对于所有区间,都只有包含和被包含关系,这就是一个树形结构. 设 \(\rm f_{i,j}\) 表示在第 \(\rm i\) 个节点,最多被覆盖 \(\r ...
- 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序
step1:下载安装 Dev-C++ 已经安装了 Dev-C++ 或系统中的可以跳过这步.去官网下载 Dev-C++.我昨天下载,发现有点慢,所以我把安装文件放到百度网盘了,供大家下载,下载链接为:h ...
- Qt简单的文件创建和读写
1 QFile fp; //要包含必要的头文件,这里省略 2 QDir(dir); 3 QString path("./"),filename("test.txt&quo ...
- HttpClient4.3 教程 第五章 快速API
5.1.Easy to use facade API HttpClient从4.2开始支持快速api.快速api仅仅实现了HttpClient的基本功能,它只要用于一些不需要灵活性的简单场景.例如,快 ...
- Python的dict
dict把key和value关联起来,可以通过 key来查找 value. 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可.最后一个 key: value 的逗号可以 ...