目录

坐标

引言: 坐标是依赖管理的基础,是构建的唯一标识。

组成元素: 使用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之坐标和依赖的更多相关文章

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

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

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

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

  3. Maven(2)-坐标和依赖

    本文简要介绍Maven里面的坐标(coodinate)以及maven依赖管理(Dependency) 一.坐标 先来个截图: 在上图peoject栏目有groupId,artifactId,versi ...

  4. Maven添加坐标(依赖)及在Eclipse中的操作

    例如:添加一个spring-test.jar的依赖过程,普遍的做法就是直接操作pom.xml文件. 1.打开maven的中央仓库:http://search.maven.org/ 2.搜索仓库: 进入 ...

  5. 3.Maven坐标和依赖

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

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

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

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

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

  8. 03 Maven 坐标与依赖

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

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

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

随机推荐

  1. 动态规划(股票交易)---只能进行 k 次的股票交易

    只能进行 k 次的股票交易 188. Best Time to Buy and Sell Stock IV (Hard) 题目描述:   只能进行K次股票交易,求能获得的最大利润 思路分析:   和只 ...

  2. java中的四种引用方式(强引用,软引用,弱引用,虚引用)

    java内存管理主要有内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java中对象的引用主要有四种:强引用,软引用,弱引用,虚引用. Java中提供这四种引 ...

  3. Pose &&Get的区别

    从一个页面转向另一个页面的请求方式有两种,Post和Get. 如果从原理上来探究他们的区别,涉及到Http传输协议的细节,本文不加探究,只讨论一下表象. 1.Post传输数据时,不需要在URL中显示出 ...

  4. 要了解mysql原理,还是要心里有点B树才行

      要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库索引底层的原理! ...

  5. vue 使用element-ui中的Notification自定义按钮并实现关闭功能以及如何处理多个通知

    使用element-ui中的Notification,只有一个message属性是有很大的操作空间,其余的都是写死的,无法进行扩展,达不到想要的效果.所以只能在message上下功夫. 在elemen ...

  6. 混合加密算法(RSA和DES)

    一.混合加密的理由 a.前面提及了RSA加解密算法和DES加解密算法这两种加解密算法,由于随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,追溯历史破解DES的案例层出不穷,一台实际的 ...

  7. PAT Basic 1041 考试座位号 (15 分)

    每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考 ...

  8. 北京师范大学第十五届ACM决赛-重现赛E Euclidean Geometry (几何)

    链接:https://ac.nowcoder.com/acm/contest/3/E 来源:牛客网 Euclidean Geometry 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  9. Attention Points

    Attention Points 数组范围 无向图.树,边表的范围是边数的两倍. 因为最近树的题目做的比较多,一定要注意分清是树还是图,不能冲上去就去开struct Edge{int to,ne,w; ...

  10. python 使用wxpy实现获取微信好友列表 头像 群成员

    最近在学习 python 突然想要试试能不能把微信里面的微信群和好友取出来 结果百度了一下 找到了 wxpy 这怎么能不试一下呢 用到 wxpy.threading.os.time 四个库 第一步 判 ...