maven入门-- part4 坐标和依赖
Maven的坐标为各种构件引入了秩序,任何一个构件都必须明确的定义自己的坐标,maven的坐标包括如下的元素:
groupId: 定义当前Maven项目隶属的实际项目
artifactId: 该元素定义实际项目中的一个Maven项目或模块
version: 该元素定义Maven项目当前所处的版本
packaging: 该元素定义Maven项目的打包方式
classifier: 该元素用来帮助定义构建输出的一些附属构件
注:groupId、artifactId、version、packaging是必须定义的,classifier是不能被直接定义的,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。
依赖:
Maven在编译项目主代码的时候需要使用编译classpath
Maven在编译和执行测试的时候会使用测试classpath
Maven在实际运行项目的时候又会使用运行classpath
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系
Maven的5种依赖范围:
compile: 编译依赖范围(默认),对于编译、测试、运行三种classpath都有效,如:spring-core
test: 测试依赖范围, 只对测试classpath有效。典型范例:Junit
provided: 已提供依赖范围 对于编译和测试classpath有效,但在运行时无效。典型范例:servlet-api
runtime: 运行时依赖范围 对于测试和运行classpath有效,但在对编译主代码时无效。典型范例:JDBC
system: 系统依赖范围,本地的Maven仓库之外的类库文件
传递性依赖
简单的说,一般项目中出现问题多数是因为重复的引用或者引用了较低版本的依赖,或者是他们的依赖范围发生了变化。
举个例子来理解传递性依赖:
我们创建了一个Maven Project-----learnDependency,然后我们引入了spring-core这个依赖,然后我们打开spring-core的pom.xml发现,spring-core也有自己的依赖:commons-logging,而且该依赖没有声明依赖范围,那么默认的就是compile,所以这时我们就可以说:commons-logging也是learnDependency的一个依赖,这时我们就将这种依赖称之为传递性依赖,commons-logging是learnDependency的一个传递性依赖。有了传递性依赖,我们就可以在使用的时候不去考虑我们引入的依赖到底是否需要其它依赖,和是否引入多余的依赖,Maven 会解析各个直接依赖的pom,将必要的间接依赖引入到项目中。
假设:A依赖于B,B依赖于C,那么我们就说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。
因为依赖是有依赖范围的,那么对于这种传递性依赖Maven又是如何界定其依赖范围的呢?
(1)当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;
(2)当第二直接依赖的范围是test的时候,依赖不会得以传递
(3)当第二直接依赖的范围是provided的时候,只传递第一依赖范围也为provided的依赖,且传递性依赖的范围同样是provided;
(4)当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile除外,此时传递性依赖范围为runtime

maven引入依赖的两个原则:
(1)路径就近原则,如a->c->d1.0。另一依赖:b->d2.0,则会选d2.0
(2)声明顺序前面的优先级高。a->c1.0 。 b->c2.0,则a先定义取c1.0
因为上面的原则,所以有时候会出现依赖冲突的问题。
有很多同一项目的不同模块,这些依赖的版本都是相同的,则可以使用properties定义属性,${}引用。
优化依赖:
mvn dependency : list 查看当前项目的已解析依赖
mvn dependency : tree 查看当前项目的依赖树
mvn dependency : analyze 得出
Used undeclared dependencies: 表示项目中使用到的,但是没有显示声明的依赖
Unused declared dependencies: 表示项目中未使用的,但显示声明的依赖
注:dependency : analyze只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它无法发现
maven入门-- part4 坐标和依赖的更多相关文章
- 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专题1——坐标与依赖
1. 坐标 坐标用来唯一定位一个Maven构件: GAV(必需):groupId, artifactId, version packaging(可选): 可取值如:jar(缺省), war, pom, ...
- Maven入门指南③:坐标和依赖
1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可 ...
- 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入门(8)maven的依赖管理
我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置 依赖可以声明如下: <project> ... <dependenci ...
- 【Maven】---坐标与依赖
Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在 ...
随机推荐
- easyUI之validatebox验证框
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- Linux命令对应的英文全称【转载】
su:Swith user 切换用户,切换到root用户cat: Concatenate 串联uname: Unix name 系统名称df: Disk free 空余硬盘du: Disk u ...
- Pro JavaScript List.11-11
//为实现各种现代浏览器的requestAnimationFrame()方法,创建一段简单的跨浏览器保障代码(polyfill),以实现流畅.高效的动画.由保罗•艾里什(Paul Irish)编写,网 ...
- js手写数组Api--模拟实现常见数组Api
数组的API经常用,但是api的内部实现还没研究过,于是就研究学习了下. 原文地址: https://www.cnblogs.com/yalong/p/11606865.html 数组的API的具体使 ...
- 每个开发者都应该知道的SOLID原则
每个开发者都应该知道的SOLID原则 单一职责原则(SRP) 它为什么违反了 SRP? 这种设计将来会带来什么问题? 开闭原则(OCP) 如何使它(AnimalSound)符合 OCP? 里氏替换原则 ...
- Python3 编程第一步_斐波纳契数列_连续赋值
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b # 1 ...
- Nginx日志中的金矿
http://www.infoq.com/cn/articles/nignx-log-goldmine/
- LeetCode.1175-质数排列(Prime Arrangements)
这是小川的第413次更新,第446篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第264题(顺位题号是1175).返回1到n的排列数,以使质数处于质数索引(索引从1开始).(请 ...
- inxi 查看国产服务器的硬件配置信息
下载inxi 查看国产服务器的信息 https://codeload.github.com/smxi/inxi/tar.gz/3.0.35-1 注意查看命令是 ./inxi -F 2. 直接是二进制包 ...
- docker容器创建MariaDB镜像
基于commit命令方式创建 docker的安装 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl enable docke ...