maven坐标和依赖

maven坐标和依赖

坐标

坐标的三要素:

  • groupId 项目名,通常是域名+项目
  • artifactId 模块名,通常是项目+模块
  • version 版本号

他们就像三维空间的xyz坐标,唯一确定了构件。packageing是可选的,默认构件的打包方式是jar

依赖

依赖范围

依赖范围标签是<scope>,它实际上控制了项目的三种classpath(编译classpath,测试classpath,运行时classpath)。maven的依赖范围有

依赖范围 有效范围 例子
compile 编译、测试、运行时 spring-core
test 测试 jUnit
provided 编译、测试 servler-api
runtime 测试、运行时 jdbc的实现
system 编译、测试 显示使用标签指定本地类库文件
import 不影响 继承其它pom的dependencymanage

依赖传递

依赖通过pom.xml文件传递,查看pom文件即可得知构件的依赖情况。Maven会解析每个直接依赖的pom文件,选择性的解析传递性依赖,递归的将依赖的构件引入当前项目。

传递性依赖的关系表(a->b第一依赖,b->c第二依赖,a->c传递依赖)

1\2 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - - provided
runtime runtime - - runtime

依赖调解

当a对b出现多条传递依赖关系,例如a->b->c(1.0)和a->d->e->c(2.0),按照以下规则调解:

  1. 路径最近者优先
  2. 第一声明者优先

排除依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--排除声明-->
<exclusions>
<exclusion>
<groupId>
<artifactId>
<!--无需version-->
</exclusion>
</exclusions>
</dependency>
</dependencies>

分析依赖

  • dependency:list 查看已解析依赖
  • dependency:tree 查看依赖树
  • dependency:analyze 分析依赖,是否使用

dependency中的标签注释

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
26
27
28
29
30
31
32
33
34
35
<project>
...
<!--依赖管理标签,通常出现在pom继承情况下-->
<dependencyManagement>
<!--所有的依赖-->
<dependencies>
<!--每个依赖-->
<dependency>
<!--项目名-->
<groupId>group-a</groupId>
<!--模块名-->
<artifactId>artifact-a</artifactId>
<!--版本-->
<version>1.0</version>
<!--打包类型-->
<type>bar</type>
<!--依赖范围-->
<scope>runtime</scope>
<!--可选依赖-->
<optional>true</optional>
<!--如果时system依赖-->
<systemPath/>
<!--所有排除的依赖-->
<exclusions>
<!--每个被排除的依赖-->
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
...
</dependencies>
<dependencyManagement>
</project>

参考文档

作者: wuzhaoyang(John)
出处: http://wuzhaoyang.me/
因为作者水平有限,无法保证每句话都是对的,但能保证不复制粘贴,每句话经过推敲。希望能表达自己对于技术的态度,做一名优秀的软件工程师。