上一篇博文讲到如何安装maven,这篇算是它的续篇,总结下maven是如何管理依赖的。
maven强大之处就是管理依赖。通过依赖传递,依赖继承,以及pom导入,可以轻松实现依赖的版本管理。通过依赖scope实现在不同的生命周期时段,加入依赖。
如下是一个最简单的为当前项目添加依赖的示例:
IntelliJ Idea > Preferences… > Build, Execution, Deployment > Build Tools > Maven
Importing一栏,将”Import Maven projects automatically” 勾选上。如果这一栏没有勾选的话,Idea会在右上角有个漂浮提示,也可以从这个提示那里点击开启。
接下来,往pom.xml里添加一条依赖,IDE会自动将此依赖添加到External Libraries里面。
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
#### 依赖传递 ####
比如我在pom.xml里加上了junit. 而junit要依赖于hamcrest-core。但是我不用再添加对于hamcrest-core的依赖,maven会自动做掉,于是我的External Libraries里面不仅有junit,还有hamcrest-core.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
#### 依赖scope ####
- compile: 默认的scope,如果在dependency节点里没有写scope,那么它默认是compile
- provided: JDK/容器在运行时会产生/提供这个依赖
- runtime: 依赖仅在运行时需要,在编译时是不需要的
- test: 依赖仅用于测试,并不用于真正的appliation,比如添加junit依赖时,就可以为它加上scope = test,前提是application本身真的不需要用到junit
- system: 貌似已经弃用了…
- import: 导入别的pom的dependencyManagement部分
#### 依赖继承 ####
依赖继承有两个重要作用:
- 将子项目的公用依赖加入到父项目里,化简子项目的pom.xml
- 通过父项目的dependencyManagement里申明的版本号来管理所用依赖的版本
如下例子来自maven官方文档。Project A是父项目。Project B是A的子项目,所以B继承了A申明在dependencyManagement段落里的依赖,即:a-1.2,b-1.0,c-1.0,d-1.2。
但是由于B自己本身有定义对于a和c的依赖,所以对于依赖a, B会用自己本身定义的a-1.0。对于依赖c,B里面并未定义版本,所以maven会上溯至父亲A中找到对c的版本定义,所以是c-1.0。对于依赖b,它没有定义在B自己的pom里,所以继承自父亲A,b-1.0。对于依赖d,父亲A里有,自己的dependencyManagement也有,优先选用自己的,所以是c-1.0。
<parent>
<artifactId>A</artifactId>
<groupId>maven</groupId>
<version>1.0</version>
</parent>
Project A的pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>maven</groupId>
<artifactId>A</artifactId>
<packaging>pom</packaging>
<name>A</name>
<version>1.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>a</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>b</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>c</artifactId>
<version>1.0</version>
<scope>