Maven依赖管理简介
如果我们想要创建一个Java项目,我们首先需要知道我们这个项目需要确定哪些依赖包。例如,如果我们需要junit
,我们就需要把它的jar包放入classpath中。如果我们还需要其他的包,那么也要把其他的包加入到classpath中。
但是这个过程,往往十分繁琐,可以想象这样一个场景,我们的Java项目中依赖了a包,a包又依赖了b包,b包又依赖了c包... ...
a->b->c->d->e->··· ···
Maven
可以很好的帮助我们解决这个问题,通常情况下一个使用Maven管理的普通的Java项目,它的目录结构看起来是下面这个样子的:
a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target
项目的根目录a-maven-project
是项目名,它有一个项目描述文件pom.xml
,存放Java源码的目录是src/main/java
,存放资源文件的目录是src/main/resources
,存放测试源码的目录是src/test/java
,存放测试资源的目录是src/test/resources
,最后,所有编译、打包生成的文件都放在target
目录里。这些就是一个Maven项目的标准目录结构。
前面说到Maven可以替我们进行依赖管理,解放生产力,就是因为当我们需要依赖前文中所提到的a包时,我们只需要声明我们依赖了a包,Maven就会自动将a包依赖的包加入我们的项目依赖
申明一个依赖的方式也很简单,只需在pom.xml
中进行配置即可,例如
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.2</version>
<scope>test</scope>
</dependency>
我们只需要将这几行语句添加到pom.xml
中以<dependencies>
开头,以</dependencies>
结尾的中间,就声名了这个依赖,而这个包依赖的其他包,也会由Maven自动帮我们加入到项目中,如下图。
最后解释一下这几行语句的意义:
其中,groupId
类似于Java的包名,通常是公司或组织名称,artifactId
类似于Java的类名,通常是项目名称,再加上version
,一个Maven工程就是由groupId,artifactId和version作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。scope
作中文讲是范围的意思,它声明了几种依赖关系,具体见下表:
scope | 说明 |
---|---|
compile | 编译时需要用到该jar包(默认) |
test | 编译Test时需要用到该jar包 |
runtime | 编译时不需要,但运行时需要用到 |
provided | 编译时需要用到,但运行时由JDK或某个服务器提供 |
总结
- 在Maven中声明一个依赖项可以自动下载并导入classpath
- Maven使用groupId,artifactId和version唯一定位一个依赖。
- Maven使用pom.xml定义项目内容,并使用预设的目录结构
- Maven常用的4种scope有:compile(默认),test,runtime和provided