一、坐标
任何一个构件(jar、war)都可以用Maven坐标唯一表示。
Maven坐标有五个元素构成groupId、artifactId、version、packaging、classifier。
groupId:定义当前Maven项目隶属的实际项目 与java包名的表示方式类似,通常与域名反向一一对应。
artifactId:该元素定义实际项目中的一个Maven项目(模块),实际项目名前缀+模块名的形式。
version:构件的版本信息。
packaging:打包方式,默认的是jar,jar和war打包会使用不同的命令,影响构件的生命周期。
classifier:该元素用来帮助定义构建输出一些附属构件(一些类似于**-doc.jar和**-sources.jar).。
其中前三个是必须定义的,packaging是可选的,默认是jar,classifier是不必定义的。
二、依赖
在声明依赖时,每个依赖可以包含的元素有:
groupId、artifactId和version :依赖的基本坐标,是最重要的。
type:依赖的类型,对应于坐标定义的packaging,大部分情况下不必定义默认值为jar
scope:依赖的范围。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。
1、依赖范围
依赖范围是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系:
(1)compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
(2)test:测试依赖范围。使用此依赖范围的Maven依赖,只对测试classpath有效,在编译主代码或者运行项目的时候将无法使用此依赖。比如JUnit
(3)provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。比如servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复引入一遍。
(4)runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。比如JDBC驱动实现,项目主代码编译只需要JDK提供的JDBC接口,只在执行测试或者运行的时候才需要实现上述接口的具体JDBC驱动。
(5)system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致,但是使用system范围的依赖时必须通过systemPath元素显示指定依赖文件的路径。
(6)import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。
2、依赖传递
A-->B B-->C 那么A-->C
如果A依赖了B,B依赖了C,那么A也依赖于C,B对于A来说是直接依赖,也叫第一直接依赖,C对于A来说相当于是传递性依赖。
3、依赖冲突
一般情况下我们不需要关系传递性依赖,那么当多个传递性依赖中有对于同一个构件不同版本的依赖时,那么到底会依赖那个版本?会不会产生冲突?
遵守两个原则:
(1)短路径优先原则,A-->B-->C-->X(版本1.0)和A-->D-->X(版本2.0),那么会选择短路径的2.0版本。
(2)在路径长度一致的时候,会遵循第二原则:先声明原则,谁先声明,谁会被采用
4、依赖排除
上面我们说过了短路径优先原则,那么如果我们就想用长路径的依赖肿么办那???
可以用我们上面提到的<exclusions>元素来把短路径的依赖排除掉。
在不冲突的时候这个标签也可以用,排除某个不需要的依赖。
5、依赖归类
主要作用是用来统一管理,便于维护和升级。
比如我们项目中同时依赖了统一构件的不同模块,他们的版本是相同,这时候就可以进行归类。用到了Maven的属性,类似于变量的概念。
<properties> <springframework.version>3.2.0.RELEASE</springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> </dependencies>