1、理解Maven scope依赖范围的做用java
Maven在编译项目主代码的时候须要使用一套classspath。总共有三种classpath,分别对应于Maven编译项目主代码的时候、Maven编译和执行测试的时候、实际运行Maven项目的时候。spring
- Compile: 编泽依赖范围.若是没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。好比spring-core依赖,在编辑、测试、运行的时候都须要使用该依赖。
- test: 测试依赖范围。使用此依赖范围的Maven依赖,只对测试的classpath有效,在编译主代码或者运行项目时没法使用此类依赖。好比JUnit的依赖,它只有在编译测试代码及运行测试的时候须要
- provided:以提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试的classpath有效,但在运行时无效。好比servlet-api,编译和测试项目的时候须要用到该依赖,但在运行项目的时候,因为容器已经提供,就不须要Maven重复的引入一遍。
- runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。好比JDBC驱动的实现,项目主代码编译的时候,只须要JDK提供的JDBC接口就能够,可是在执行测试或者运行项目的时候才须要实现实现JDBC接口的具体JDBC驱动。
- import:scope=import,type=pom表示在此pom中引入spring-boot-dependencies的pom的全部内容,注意只能在dependencyManagement中使用。
- system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围彻底一致。只是,使用system范围依赖时,须要指定systemPath元素显示地指定依赖文件的路径。因为此依赖不是Maven仓库解析的,并且每每与本机系统绑定,可能形成构建的不可遗址,所以不建议使用。systemPath元素能够引用环境变量,如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
2、依赖范围与classpath的关系sql
依赖范围(scope) |
对于编译classpath有效 |
对于测试classpath有效 |
对于运行时classpath有效 |
例子 |
compile |
Y |
Y |
Y |
spring-core |
test |
- |
Y |
- |
JUnit |
provided |
Y |
Y |
- |
servlet-api |
runtime |
- |
Y |
Y |
JDBC驱动实现 |
system |
Y |
Y |
- |
本地的,Maven仓库以外的类库文件 |