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 管理typepom类型的依赖

通常一个项目的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

表格说明:

  1. 最左侧列是第一直接依赖,如A依赖于B,B依赖于C时,A对于B即是第1直接依赖;
  2. 最上侧行是第2直接依赖,如A依赖于B,B依赖于C时,B对于C即是第2直接依赖;
  3. 表中其他单元格表示传递依赖的依赖范围,即A传递依赖C的范围。

结论:

  1. 第2直接依赖的范围是compile时,传递依赖的范围与第1直接依赖一致;
  2. 第2直接依赖是test时,依赖不会传递;
  3. 第2直接依赖是provided时,只传递依赖第1直接依赖也是provided范围的依赖。

3. 依赖调解

  1. 路径最近者优先,例如:A->B->c->x(1.0),a->d->x(2.0),由于a通过第二条路径依赖x的距离更短,因此实际解析使用的是2.0的x。
  2. 最先声明者优先,例如: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会列出两类重点关注的依赖:

  1. 使用但未声明的依赖:指项目中使用到,但是是通过传递依赖传递进来的。
  2. 声明但未使用的依赖:项目中声明了但未使用的依赖,该命令只列出编译主代码、测试代码需要的依赖,并不会发现执行测试和运行时需要的依赖,所以不应该简单地删除声明了但未使用的依赖。

Maven专题1——坐标与依赖的更多相关文章

  1. Maven学习笔记—坐标和依赖

    Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...

  2. maven学习(九)——maven中的坐标、依赖以及仓库

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...

  3. maven入门-- part4 坐标和依赖

    Maven的坐标为各种构件引入了秩序,任何一个构件都必须明确的定义自己的坐标,maven的坐标包括如下的元素: groupId: 定义当前Maven项目隶属的实际项目 artifactId: 该元素定 ...

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

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

  5. Maven之——坐标和依赖(上)

    Maven之--坐标和依赖(上) 1.    Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到详细的构件.Maven的坐标元素包含groupId.artifactId.versi ...

  6. 3.Maven坐标和依赖

    1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标 ...

  7. 【Maven】---坐标与依赖

    Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在 ...

  8. Maven入门指南③:坐标和依赖

    1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可 ...

  9. 03 Maven 坐标与依赖

    Maven 坐标与依赖 Maven 的一大功能是管理项目依赖.为了能自动化地解析任何一个 Java 构件, Maven 就必须将它们唯一标识,这就依赖管理的底层基础 一一 坐标.本章将详细分析 Mav ...

随机推荐

  1. 北航OO第二单元——电梯调度

    三次作业要求简介 特点:目的选层电梯 在电梯的每层入口,都有一个输入装置,让每个乘客输入自己的目的楼层.电梯基于这样的一个目的地选择系统进行调度,将乘客运送到指定的目标楼层. 第一次: 在任意时刻输入 ...

  2. kali虚拟机安装VMTools、更新源、安装docker、配置sqli-labs

    一.安装VMTools: 传送门:关于安装VMTools 跟其他版本的虚拟机安装VMTools没什么区别,也得连网(我是kali用dhcp开nat模式) 之后按照上面的链接根据博主的步骤一步一步来即可 ...

  3. 从MySQL大量数据清洗到TiBD说起

    从MySQL大量数据清洗到TiBD说起 一.业务场景: 公司主要做的业务是类似贝壳的二手房租售,公司数据库存了上亿级别的房源数据,之前的数据库使用的是 mysql,后面需要将mysql数据库切换成了 ...

  4. JS获取对象在内存中计算后的样式

    通过obj.style的方式只能取得"内联style"的值,对于<style></style>中的css属性值,则无能为力 . 我们可以用obj.curre ...

  5. Longhorn,企业级云原生容器分布式存储 - 定制默认设置

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...

  6. WPF 附件路由事件

    public class Person { public static readonly RoutedEvent NameChangedEvent = EventManager.RegisterRou ...

  7. 利用maven构建一个spring mvc的helloworld实例

    刚开始学习maven和spring mvc,学的云里雾里的 这里提供一个hello world实例,记录自己的学习之路 首先看maven官网的介绍 Apache Maven is a software ...

  8. 【转】TCP和UDP的区别

    转自:https://www.cnblogs.com/steven520213/p/8005258.html TCP和UDP是OSI模型中的运输层中的协议.TCP提供可靠的通信传输,而UDP则常被用于 ...

  9. io中的特殊流Properties

    对于去年学习IO的时候一些代码贴上来: 初识properties,因为继承自hashtable,其中可以使用put操作: package special; import java.util.Prope ...

  10. 设置rem基准值

    <script type="text/javascript"> (function(){ var docEl = document.documentElement; f ...