Maven笔记

依赖冲突解决方案

依赖冲突: 相同jar包的不同版本被直接或间接包含进项目中

可通过mvn -Dverbose dependency:tree查看依赖

解决依赖冲突

  1. 使用第一声明者优先原则

在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖

  1. 使用路径近者优先原则

即直接依赖优先于间接依赖, 将需要使用的版本放入pom.xml中, 这样项目就会使用你需要的版本, 而不是通过间接依赖传递的版本

  1. 排除依赖
1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>

不想使用通过spring-context间接传递的spring-core

  1. 版本锁定

使用dependencyManagement 进行版本锁定

pom.xml中:

1
2
3
4
5
6
7
8
9
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>

锁定spring-core使用5.2.0.RELEASE版本

坐标

Maven 坐标包括 groupId、artifactId、version、packaging 等元素

  • groupId: 一般为公司URL的反写

  • artifactId: 项目的名称

  • version: 版本

  • packaging : 项目的打包方式,默认值为 jar==(可选)==

pom.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
<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/maven-v4_0_0.xsd">
...
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

dependencies 元素可以包含一个或者多个 dependency 子元素,用以声明一个或者多个项目依赖,每个依赖都可以包含以下元素

  • groupId、artifactId 和 version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven 根据坐标才能找到需要的依赖。
  • type:依赖的类型,对应于项目坐标定义的 packaging。大部分情况下,该元素不必声明,其默认值是 jar。
  • scope:依赖的范围。
  • optional:标记依赖是否可选。
  • exclusions:用来排除传递性依赖

仓库

img

查找顺序:

(1),在本地仓库中寻找,如果没有则进入下一步。

(2),在全局配置的私服仓库(settings.xml中配置的并有激活)中寻找,如果没有则进入下一步。

(3),在项目自身配置的私服仓库(pom.xml)中寻找,如果没有则进入下一步。

(4),在中央仓库中寻找,如果没有则终止寻找。