1、Maven坐标唯一标识一个依赖构件,它包含以下元素:
1)groupId:定义该Maven项目隶属的实际项目 *
2)artifactId:定义实际项目中的一个Maven项目(模块) *
3)version:定义Maven项目当前所属的版本 *
4)packaging:项目打包方式,包括:jar、war、pom等(可选,默认为jar)
5)classifier:帮助定义构建输出的一些附属构件,如该项目会通过使用一些插件生成如:javadoc.jar和java-sources.jar,它俩就是这两个附属构件的classifier,(不能直接定义,因为由附属插件生成)
2、propertyies: 定义一些属性供下面引用
例如:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- spring版本号 -->
<spring.version>4.2.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependencies/>
3、dependency
1)groupId
2)artifactId
3)version
4)type:依赖的类型,对应于项目坐标定义的packaging(默认为Jar)
5)scope:依赖的范围
6)opetional:标记依赖是否可选
7)exclusions:用来排除传递性依赖
4、依赖范围:用来控制依赖与三种classpath的关系(编绎、测试、运行)
1)compile:编绎依赖范围,默认,三种classpath都有效,例如spring-core
2)test:测试依赖范围,只在测试classpath有效,例如junit
3)provided:已提供依赖范围,只在编绎和测试classpath有
效,例如servlet-api,因为运行时容器会提供
4)runtime:运行时依赖范围,只在测试和运行classpath有效,
例如jdbc驱动,因为编绎时只需要jdk的jdbc接口,在测
试和运行时才真正需要驱动
5)system:系统依赖范围,和provided一样,需要通过
systemPath元素显示地指定依赖位置,可以引用环境变
量,但是不推荐使用(往往与本地依赖绑定,移植性不好)
6)import:导入依赖范围,该依赖不会对三种classpath产生实
际的影响,通常和dependencyManagement结合使用
5、传递性依赖与传递性依赖范围:
定义:如果A项目依赖于B依赖,而B依赖又依赖于C依赖,那么当你在项目
A中导入B依赖时,maven会自动将C依赖导入
第一直接依赖的范围和第二直接依赖的范围决定了传递依赖的范围
如下图:最左边一行表示第一直接依赖范围,最上面一行表示第二直
接依赖范围,中间交叉部分表示传递依赖范围

6、依赖调解:当项目A有多个依赖路径时,原则是路径最近者优先,当
路径相等的情况下“第一声明者优先”
7、可选依赖:项目A依赖于项目B,项目B依赖于项目C和D,那么C和D
B对于C和D的依赖都是可选依赖,都不会传递给A,原因:C和D可能是互
斥的