依赖范围
Junit依赖的测试范围是test,测试范围用元素scope表示。本节将详细解释什么是测试范围,以及各种测试范围的效果和用途
首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath。如编译项目主代码的时候需要用到spring-core,该文件以依赖的方式被引入到classpath中。 其次,Maven在编译和执行测试的时候会使用另一套classpath。Junit就是一个很好的例子,该文件也以依赖的方式引入到测试使用的classpath中,不同的是这里的依赖范围是test。 最后,实际运行Maven项目的时值,又会使用一套classpath,如spring-core需要在该classpath,而Junit不需要。
依赖范围就是用来控制依赖与这三种classpath(编译classpath, 测试classpath, 运行classpath)的关系,Maven有以下几种依赖范围:
- compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译,测试,运行三种classpath都有效。典型的例子是spring-core,在编译,测试和运行的时候都需要使用该依赖
- test: 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是Junit,它只有在编译测试代码及运行测试的时候才需要。
- privided: 已提供依赖范围。使用此类范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由容器已经提供,就不需要Maven重复地引入一遍。
runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。 *system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量,如:
javax.sql jdbc-stdext 2.0 system ${java.home}/lib/rt.jar import(Maven 2.0.9及以上):导入依赖范围。该依赖范围不会对三种classpath产生实现的影响
依赖范围(Scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
privided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动实现 |
system | Y | Y | - | 本地的,Maven仓库之外的类库文件 |