Maven依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:java
·compile:编译依赖范围。若是没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-core,在编译、测试和运行的时候都须要使用该依赖。spring
·test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将没法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才须要。api
·provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候须要该依赖,但在运行项目的时候,因为容器已经提供,就不须要Maven重复地引入一遍。ide
·runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只须要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才须要实现上述接口的具体JDBC驱动。测试
·system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围彻底一致。可是,使用system范围的依赖时必须经过systemPath元素显式地指定依赖文件的路径。因为此类依赖不是经过Maven仓库解析的,并且每每与本机系统绑定,可能形成构建的不可移植,所以应该谨慎使用。systemPath 元素能够引用环境变量, 如:spa
1 <dependency> 2 <groupId>com.alipay</groupId> 3 <artifactId>alipay-sdk</artifactId> 4 <version>1.0.0</version> 5 <scope>system</scope> 6 <systemPath>${project.basedir}/lib/alipay-sdk-java20170818173712.jar</systemPath> 7 </dependency>
·import( Maven 2. 0. 9 及 以上):导入依赖范围。该依赖范围不会对三种 classpath 产生实际的影响。code