(二)Maven之坐标和依赖

目录
坐标
引言: 坐标是依赖管理的基础,是构建的唯一标识。
组成元素: 使用groupId、artifactId、version、packaging、classifier标签即可定义一组坐标
规定:groupId,artifactId,version是必须定义的,
packaging的定义是可选的,classifier是不能直接定义的,而是以后附加的插件帮助生成的。
<groupId> org.sonatype.nexus </groupId>
<artifactId> nexus-indexer </artifactId>
<version> 2.0.0 </version>
<packaging> jar </packaging>
groupId: 定义了Maven项目隶属的实际项目。
groupId命名误区:
- Maven项目不一定和实际项目一一对应。实际项目可能被划分为多个Maven项目
- 不应该定义到项目隶属的组织或公司级别,因为组织或公司可能有多个项目。
- 与java包名命名方式相似,通常以域名反向对应。
artifactId: 定义了下实际项目的一个Maven项目
- 建议使用实际项目名作为artifactId的前缀。
- 一般来说,项目中Java类的包都应该基于项目的groupId和artifactId.
version: 定义了Maven项目当前所处的版本。
packaging: 定义了Maven项目的打包方式。
打包方式通常与所生成构件扩展名对应,但是不是绝对的,而且打包方式会影响构建的生命周期。
classifier: 定义了构建输出的一些附属构件。如:在包中生成的文档或源代码。
依赖
eg:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
<scope>provided</version>
<optional>true</optional>
<exclusions>
<exclusion>
<groupId>XXXX</groupId>
<artifactId>XXX</artifactId>
</exclusion>
</dependency>
每个依赖包含的元素有:
- groupId,artifactId,version: 依赖的基本坐标
- type: 依赖的类型,对应定义坐标时的packaging,默认值为jar.
- scope: 依赖的范围
- optional: 当前依赖是否可选
- exclusions: 用来排除传递性依赖
依赖范围【scope】
Maven有三种classpath,分别供编译时(编译项目主代码)、测试时(编译和执行测试代码)、运行时(项目实际运行时)使用。
依赖范围: 用来控制依赖同三种classpath的关系,即:是否将依赖引入相应的classpath中。
| 依赖范围(scope) | 编译classpath 生效 | 测试classpath 生效 | 运行时classpath生效 | 栗子 |
|---|---|---|---|---|
| compile | Y | Y | Y | spring-core |
| test | N | Y | N | JUit |
| provided | Y | Y | Y | N |
| runtime | N | Y | Y | JDBC驱动实现 |
| sytem | Y | Y | N | 除本地的Maven仓库外的jar包 |
- 依赖范围不仅可以控制依赖和classpath的关系,还对传递性依赖产生影响
- 可选依赖不能被传递!!!
扩展: 为什么要使用可选依赖属性(optional)呢?
eg: 项目B进入了X、Y的两个可选依赖,一般由业务形态决定的,业务上存在互斥性,用户不可能同时使用X、Y的功能。
理想情况,其实是不应该使用可选依赖的,本着“单一职责”设计原则,最好分离开来设计。
传递性依赖
| compile | test | provided | runtime | |
|---|---|---|---|---|
| compile | compile | 不传递 | 不传递 | runtime |
| test | test | 不传递 | 不传递 | test |
| provided | provied | 不传递 | provied | provided |
| runtime | runtime | 不传递 | 不传递 | runtime |
注: 左边第一列是第一直接依赖,最上边一行是第二直接依赖。
依赖调解
当产生重复依赖冲突时,采用以下原则解决:
第一原则: 依赖路径最近者优先
eg: 路径1: A -> B -> C -> X(version:1.0)
路径2: A -> D -> X(version:2.0)
因此原则,传递性依赖X(version:2.0)将会被项目引用。第二原则: 路径长度相同,将由pom.xml总依赖声明的顺序决定。
eg: 路径1: A -> B -> Y(version:1.0)
路径2: A -> C -> Y(version:2.0)
若C的引入顺序在B的前面,则 传递性依赖Y(version:2.0)将会被项目引用。
最佳实践
- 排除依赖: 使用exclusion标签定义。
- 归类依赖: 运用Maven属性,使用properties元素定义Maven属性,并引用即可。
- 优化依赖:
mvn dependency:list (以列表方式展示项目依赖列表,包含传递性依赖)
mvn dependency:tree (以树形结构展示项目依赖列表)
(二)Maven之坐标和依赖的更多相关文章
- Maven之——坐标和依赖(上)
Maven之--坐标和依赖(上) 1. Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到详细的构件.Maven的坐标元素包含groupId.artifactId.versi ...
- 【Maven】---坐标与依赖
Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在 ...
- Maven(2)-坐标和依赖
本文简要介绍Maven里面的坐标(coodinate)以及maven依赖管理(Dependency) 一.坐标 先来个截图: 在上图peoject栏目有groupId,artifactId,versi ...
- Maven添加坐标(依赖)及在Eclipse中的操作
例如:添加一个spring-test.jar的依赖过程,普遍的做法就是直接操作pom.xml文件. 1.打开maven的中央仓库:http://search.maven.org/ 2.搜索仓库: 进入 ...
- 3.Maven坐标和依赖
1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标 ...
- Maven学习笔记—坐标和依赖
Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...
- Maven学习(二) -- 坐标和依赖
标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...
- 03 Maven 坐标与依赖
Maven 坐标与依赖 Maven 的一大功能是管理项目依赖.为了能自动化地解析任何一个 Java 构件, Maven 就必须将它们唯一标识,这就依赖管理的底层基础 一一 坐标.本章将详细分析 Mav ...
- Maven入门指南③:坐标和依赖
1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可 ...
随机推荐
- 什么是lambda函数?有什么好处?
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的匿名函数 好处:1.lambda 函数比较轻便,即用即删除,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都 ...
- 为什么要用消息队列 及 自己如何设计一个mq架构
1. 解耦:如左图, 系统a因为业务需求需要调用系统b,后续因为业务需求可能需要改代码调用系统c,甚至还要考虑被调用的系统挂了访问超时的问题.耦合性太高! 如右图, 系统a产生一条数据发送到消息队列里 ...
- Django rest_frameword 之项目流程
后端开发软件目录规范 一.Model from django.db import models # Create your models here. # 多表的设计 # 图书 作者 出版社 作者详情表 ...
- 基于双XCKU060+双C6678 的双FMC接口40G光纤传输加速计算卡381
一.板卡概述 板卡采用基于双FPGA+双DSP的信号采集综合处理硬件平台,板卡大小360mmx217mm.板卡两片FPGA提供两个FMC接口,4路QSFP+接口:每片FPGA挂接2簇32-bit DD ...
- /proc/sys/fs/file-max
Linux的/proc/sys/fs/file-max决定了当前内核可以打开的最大的文件句柄数. 查看当前的值: cat /proc/sys/fs/file-max 这个值在kernel的文档里是这样 ...
- HDU 5988 Coding Contest 最小费用流 cost->double
Problem Description A coding contest will be held in this university, in a huge playground. The whol ...
- C#基础知识之VS的快捷键汇总
VS中默认的常用快捷键.可以根据自己的习惯,自己设置快捷方式,工具->选项->环境->键盘. 编辑相关的键盘快捷键 Ctrl + K,Ctrl + C = 注释选定行 Ctrl + ...
- DDD领域驱动设计初探(六):领域服务
前言:之前一直在搭建项目架构的代码,有点偏离我们的主题(DDD)了,这篇我们继续来聊聊DDD里面另一个比较重要的知识点:领域服务.关于领域服务的使用,书中也介绍得比较晦涩,在此就根据博主自己的理解谈谈 ...
- SpringBoot使用Easypoi导出excel示例
SpringBoot使用Easypoi导出excel示例 https://blog.csdn.net/justry_deng/article/details/84842111
- 【Luogu4191】[CTSC2010] 性能优化
题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...