复杂的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>
|
