一、坐标java
Maven坐标为各个构件创建了秩序,任何一个构件都必须明确本身的坐标,一个maven坐标是由一些元素肯定的mysql
<groupId>com.alivn.account</groupId> <artifactId>account-email</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
groupId:定义为maven项目隶属的实际项目,能够至关于为一个项目的顶级。 好比 支付系统sql
artifactId:maven项目的一个子项目 好比 支付系统下的dao模块数据库
version:当前项目的版本号api
packaging:定义该maven项目的打包方式 默认jar tomcat
classifier:帮助构建输出一些附属属性,好比account-email.1.0.jar, 借助插件生成account-email.1.0-doc.jar(apiw文档)框架
二、依赖maven
每一个project根元素下,能够包含节点<dependencies>节点。里面包含了若干依赖ide
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> <type>jar</type> <optional>true</optional> <exclusions> <exclusion> <groupId>${dependencygroupId}</groupId> <artifactId>${dependencyartifactId}</artifactId> </exclusion> </exclusions> </dependency>
groupId、artifactId、version是一个引入一个依赖必不可少的元素。测试
scope:依赖的做用范围 test表示 只在test的代码里面的生效
type:依赖的类型 对应packaging
optional:依赖是否可选。
exclusions:排除依赖,当第二依赖里面依赖了一个不稳定的快照版本的jar时候,存在潜在危险,因此咱们应该排除第二依赖里面的那个不稳定版本的依赖,在pom中引用为直接依赖。
三、依赖范围
maven在编译 测试 和运行时会使用三个不一样的classpath,会根据以依赖范围处理不一样的内容,好比主编译时,不会加入scope为test范围的代码,由于它的依赖范围是test
有如下几种依赖范围
compile:编译依赖范围 默认值 对编译 测试 运行 三种 classpath都有效
test:测试依赖范围 只对测试classpath有效
provided:以提供以来范围,仅对编译和测试有效,运行无效,好比servlet-*jar,运行时 框架有tomcat提供jar
runtime:对测试和运行有效 但编译无效 如JDBC驱动,只在运行的时候决定使用哪一个数据库的驱动
system:系统依赖范围,和provided范围一致,但必须经过systemPath显示指定依赖文件
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> <scope>system</scope> <systemPath>${home}/lib/mysql.rt</systemPath> </dependency>
四、传递性依赖
A->B ,B->C=》A->C
若是A依赖于B B依赖于C 那么A依赖于C B为A 的第一直接依赖 C为B 的第二直接依赖。
根据scope的依赖范围不一样 能够将C于A 的依赖范围 也会有变化 ,具体变化为如下表格 蓝色字体为第一直接依赖 红色字体为第二直接依赖
依赖范围 | compile | test | provided | runtime |
compile | compile | —— | —— | runtime |
test | test | —— | —— | test |
provided | provided | —— | provided | provided |
runtime | runtime | —— | —— | runtime |
五、依赖调解
maven传递依赖为咱们带来了不少的方便,可是若是 A->B->C(2.0) A->D->C(1.0) 这个时候会解析 哪一个版本的C
maven有两条规则:(当第一条规则 不生效时 使用第二条规则)
一、路径最近者优先 实例中 都是两步 距离是相同的 若是不一样则去最近者
二、第一声明者优先 程序中 看B 和C 哪一个jar里面的类先被使用,而后解析先被使用的jar的那条线路上的c
六、查看依赖的命令
mvn dependency:list(显示全部已解析的依赖)
mvn dependency:tree(显示依赖树)
mvn dependency:analyze(分析当前项目的依赖)