依赖配置详解
首先要处理依赖,首先我们先要知道pom文件的依赖配置以及每个标签的含义是什么。
<project>
...
<dependencies>
<dependency>
<!-- 坐标定位 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<!-- 依赖类型(pom/jar/war/maven-plugin) -->
<type>...</type>
<!-- 作用域 -->
<scope>...</scope>
<!-- 是否可选 -->
<optional>...</optional>
<!-- 依赖排除 -->
<exclusions>
<exclusion>...</exclusion>
</exclusions>
</dependency>
...
</dependencies>
...
</project>
依赖配置中除了构件的坐标信息(groupId、artifactId和version)之外,还有其他的元素。接下来就简单介绍一下这些元素的作用。
- type:依赖的类型,同项目中的packaging对应。大部分情况不需要声明(默认是jar),当然type可选项有pom、jar、war、maven-plugin;
- scope:依赖的范围选择,可选参数有:
- compile:编译依赖范围(默认),全局有效
test:测试依赖范围
provided:已提供依赖范围,针对编译/测试有效
runtime:运行时依赖,针对测试/运行时有效
import:导入依赖范围,将其他模块定义好的dependencyManagement导入当前Maven项目pom的dependencyManagement中
- optional:标记依赖是否可选(不建议配置),详情可以参考:http://c.biancheng.net/view/5005.html中搜索(2.可选依赖)关键字,下面有具体的说明(可以使用<dependencyManagement>和<pluginManagement>来替换该功能)。
- exclusions:用于排除传递性依赖。
多模块依赖的统一管理
这个很简单,可以使用<dependencyManagement>标签和<pluginManagement>标签进行多模块依赖的统一管理,如下所示:
父模块pom配置
<?xml version="1.0"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
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>com.xxx</groupId>
<artifactId>yyy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>zzz</module>
// ......
</modules>
// ......
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
// ......
</dependencyManagement>
// ......
</project>
子模块pom配置
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xxx</groupId>
<artifactId>yyy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>zzz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
//......
</dependencies>
// ......
</project>
MAVEN是如何对依赖冲突进行处理的?
Maven对依赖冲突的解决主要有两种方式:自动排除依赖和手动排除依赖。
自动排除依赖
首先Maven依赖处理原则有两个基本原则:一个是路径优先原则(最短路径选择);另一个是声明优先原则(最先声明选择)。当路径优先原则搞不定的时候,再使用声明优先原则。
路径优先原则:一个项目中对同一个包的引用,但是路径是有区别的,比如A->B->C(2.0.0),另一个是A->C(1.0.0)。由于路径优先原则,所以选择的是C(1.0.0)。
声明优先原则:一个项目中对同一个包的引用路径长度是一样的(A->B->C(2.0.0),A->D->C(1.0.0)),由于路径长度一样,这时候Maven会启用声明优先原则,选择先声明的C(2.0.0)。
手动排除依赖
一般情况下如果我们需要手动进行依赖的排除,可以使用<exclusions>标签进行排除。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
如果我们需要直观地查看项目的依赖情况可以通过Idea提供的功能进行查看。