目录
spring
引言: 坐标是依赖管理的基础,是构建的惟一标识。api
组成元素: 使用groupId、artifactId、version、packaging、classifier标签便可定义一组坐标
规定:groupId,artifactId,version是必须定义的,
packaging的定义是可选的,classifier是不能直接定义的,而是之后附加的插件帮助生成的。maven
<groupId> org.sonatype.nexus </groupId> <artifactId> nexus-indexer </artifactId> <version> 2.0.0 </version> <packaging> jar </packaging>
groupId命名误区:ide
- Maven项目不必定和实际项目一一对应。实际项目可能被划分为多个Maven项目
- 不该该定义到项目隶属的组织或公司级别,由于组织或公司可能有多个项目。
- 与java包名命名方式类似,一般以域名反向对应。
- 建议使用实际项目名做为artifactId的前缀。
- 通常来讲,项目中Java类的包都应该基于项目的groupId和artifactId.
打包方式一般与所生成构件扩展名对应,可是不是绝对的,并且打包方式会影响构建的生命周期。测试
eg: <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> <scope>provided</version> <optional>true</optional> <exclusions> <exclusion> <groupId>XXXX</groupId> <artifactId>XXX</artifactId> </exclusion> </dependency>
每一个依赖包含的元素有:优化
Maven有三种classpath,分别供编译时(编译项目主代码)、测试时(编译和执行测试代码)、运行时(项目实际运行时)使用。
依赖范围: 用来控制依赖同三种classpath的关系,即:是否将依赖引入相应的classpath中。spa
依赖范围(scope) | 编译classpath 生效 | 测试classpath 生效 | 运行时classpath生效 | 栗子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | N | Y | N | JUit |
provided | Y | Y | Y | N |
runtime | N | Y | Y | JDBC驱动实现 |
sytem | Y | Y | N | 除本地的Maven仓库外的jar包 |
- 依赖范围不只能够控制依赖和classpath的关系,还对传递性依赖产生影响
可选依赖不能被传递!!!插件
扩展: 为何要使用可选依赖属性(optional)呢?
eg: 项目B进入了X、Y的两个可选依赖,通常由业务形态决定的,业务上存在互斥性,用户不可能同时使用X、Y的功能。
理想状况,实际上是不该该使用可选依赖的,本着“单一职责”设计原则,最好分离开来设计。设计
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | 不传递 | 不传递 | runtime |
test | test | 不传递 | 不传递 | test |
provided | provied | 不传递 | provied | provided |
runtime | runtime | 不传递 | 不传递 | runtime |
注: 左边第一列是第一直接依赖,最上边一行是第二直接依赖。
当产生重复依赖冲突时,采用如下原则解决:
第一原则: 依赖路径最近者优先
eg: 路径1: A -> B -> C -> X(version:1.0)
路径2: A -> D -> X(version:2.0)
所以原则,传递性依赖X(version:2.0)将会被项目引用。
第二原则: 路径长度相同,将由pom.xml总依赖声明的顺序决定。
eg: 路径1: A -> B -> Y(version:1.0)
路径2: A -> C -> Y(version:2.0)
若C的引入顺序在B的前面,则 传递性依赖Y(version:2.0)将会被项目引用。
优化依赖:
mvn dependency:list (以列表方式展现项目依赖列表,包含传递性依赖) mvn dependency:tree (以树形结构展现项目依赖列表)