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了,版本存在 ...
随机推荐
- Java:基础知识点
1. 面向对象的特征 (1)封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面.即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象:(2)继承:是一种 ...
- intellij import包 顺序调整
intellij中自动import的包顺序与eclipse不太一致,可以参照以下方式进行调整: eclipse中(笔者用的是eclipse luna)导入包的顺序依次是: javajavaxorgco ...
- Vim的强大配置文件
我的vim配置主要有以下优点: 1.按F5可以直接编译并执行C.C++.java代码以及执行shell脚本,按“F8”可进行C.C++代码的调试 2.自动插入文件头 ,新建C.C++源文件时自动插入表 ...
- ProbCog[github]使用心得
1. After installing ProbCog,you can run blnquery and mlnquery. If the terminal warns that 'command n ...
- SpringBoot: 7.整合jsp(转)
springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymeleaf,对于java开发人员来说还是大多数人员喜欢使用jsp 1.创建maven项目,添加pom依赖 ...
- vue+element ui 重置表单
<el-dialog :title="addForm.title" :visible.sync="dialogFormVisible" width=&qu ...
- 【CodeForces - 707B】Bakery(思维水题)
Bakery Descriptions 玛莎想在从1到n的n个城市中开一家自己的面包店,在其中一个城市烘焙松饼. 为了在她的面包房烘焙松饼,玛莎需要从一些储存的地方建立面粉供应.只有k个仓库,位于不同 ...
- mysql主主、mysql-proxy读写分离、keepalived高可用完美组合
配置mysql主主复制 服务器A:172.16.100.9 服务器B:172.16.100.10 首先在服务器A和服务器B上各安装好单机版mysql5.7,安装好后,再继续下面的操作. 在服务器A和服 ...
- 2019Java常见面试上
一.开场白简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容:(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) ...
- Oracle的基本操作-序列的使用
序列:默认从1开始,一次递增,主要用来给主键赋值使用 create sequence s_person; select s_person.nextval from dual; --dual是一张虚表, ...