复杂的maven版本依赖优先级

查看依赖

  • install IDE plugin —— Maven Helper
  • execute goal —— mvn dependency:tree

版本号来源

直接依赖

元素 groupId,artifactId,version,scope,optional,type,classifier,exclusions

唯一标识id:groupId,artifactId,classifier(附属构件)

范围:scope

阻断传播:optional,exclusions

  • 排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
  • 可选依赖是控制当前项目的依赖是否向下传递;
  • 可选依赖的优先级高于排除依赖;

示例

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provide</scope>
<optional>false</optional>
<classifier>jakarta</classifier>
<type>jar</type>
</dependency>

依赖传递

可以传递的依赖

依赖范围(compile,test,provided,runtime,import,system)

用于控制三种classpath 运行/编译/测试

provided仅在测试和编译时生效,不会打入包中,比如说lombok

runtime仅在测试和运行时生效,打入包中,比如说用法Class.forName(“com.mysql.jdbc.Driver”)

test仅在测试时生效,不会打入包中

当前pom\上层pom provided test runtime compile
provided provided - provided provided
test - - test test
runtime - - runtime runtime
compile - - runtime compile
传递依赖的优先级
路径最近者优先

cache-starter ——> redis-cache ——> cache-base

kafka-mq ——> cache-base

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>kafka-mq</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

example 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
第一声明者其次

redis-cache ——> cache-base

kafka-mq ——> cache-base

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>kafka-mq</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
同级依赖后加载覆盖先加载
1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>kafka-mq</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>kafka-mq</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

如果用 dependencyManagement管理版本号,顺序会和当前结果不同吗

依赖管理

dependencyManagement doc

依赖继承

继承的pom方式的版本管理间接依赖的优先级高

可以继承的pom元素 doc

groupId, version, dependencies, dependencyManagement, properties, repositories, build

description,organization,url 等

复杂场景下版本断定

同一级别下pom方式的版本管理路径比间接依赖

example 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-dependencies</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
</dependency>
</dependencies>

example 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-dependencies</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

example 3

parent

1
2
3
4
5
6
7
8
9
10
11
12
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-dependencies</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

当前目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
</dependency>
</dependencies>
父pom传递依赖的路径比当前目录管理传递依赖的路径远

example 1

parent

1
2
3
4
5
6
7
8
9
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>

当前目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>redis-cache</artifactId>
</dependency>
</dependencies>
第一声明者优先

example 1

两个dependencies管理层级相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-dependencies</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>mq-dependencies</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
</dependency>
</dependencies>

example 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jpan</groupId>
<artifactId>cache-base</artifactId>
</dependency>
</dependencies>