目录
- 坐标
- 坐标详解
- 依赖的配置
- 依赖的范围
- 传递性依赖
- 作用
- 传递性依赖和依赖范围
- 传递性调解
- 最佳实践
- 排除依赖
- 归类依赖
坐标
maven定义了这样一组规则,世界上任何一个构件都可以使用maven坐标唯一标识,maven坐标的元素包括groupId, artifactId, version, packaging, classifier。Maven内置了一个中央仓库的地址,该中央仓库包含了世界上大部分流行的开源项目构件,Maven会在需要的时候去那里下载。
坐标详解
groupId:定义当前maven项目隶属的实际项目。
artifactId:定义实际项目中的一个Maven项目,推荐使用实际项目名称作为其前缀。
version:定义Maven项目当前所处的版本。
packaging:定义Maven项目的打包方式。
classifier:帮助定义构建输出的一些附属构建。
前三者为必须定义的,packaging是可选的,classifier不能直接定义。
依赖的配置
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:
groupId、artifactId和version:依赖的基本坐标。
type:依赖的类型,对应于项目坐标定义的packaging。
scope:依赖的范围。
optional:标记依赖是否可选。
exclusion:排除传递性依赖。
依赖的范围
Maven在编译、执行测试、实际运行的时候都需要使用不同的classpath。依赖范围就是用来控制依赖与这三种classpath的关系,如下:
传递性依赖
作用
有了传递性依赖,在使用类库时就不必考虑它依赖了什么,也不用担心引入多余的依赖。Maven会解析各个直接依赖的pom,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
传递性依赖和依赖范围
如下图,最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间的单元则表示传递性依赖范围。
传递性调解
第一原则:距离近者优先。
第二原则:第一声明者优先。
最佳实践
排除依赖
dependency中exclusions元素声明排除依赖,exclusions可以包含一个或多个exclusion元素,因此可以排除一个或多个传递性依赖。需要注意的是,声明exclusion的时候只需要定义groupId和artifactId,而不需要version,因为这两个就可以定位依赖图中的某个依赖。
归类依赖
见以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<junit.version>4.12</junit.version>
<slf4j.log4j.version>1.7.25</slf4j.log4j.version>
<fastjson.version>1.2.47</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.log4j.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</project>