首先需要知道,Maven 在编译项目时使用一套 classpath;依赖范围就是用来控制与三种 classpath(编译 classpath、测试 classpath 和 运行 classpath) 的关系。
依赖范围
Maven 有以下几种依赖范围,即 scope
元素对应的可选值:
- compile:编译依赖范围,默认使用该依赖范围;该依赖范围对于编译、测试和运行都有效;
- test:测试依赖范围,该依赖范围只对于测试 classpath 有效,典型的例子是 JUnit;
- runtime:运行时依赖范围,此依赖范围对于测试和运行都有效;
- provided:已提供依赖范围,此依赖范围对于编译和测试有效,但在运行时无效;典型的例子是 servlet-api,编译和测试时需要,但在运行时由于容器已提供,就不需要重复引入;
- system:系统依赖范围,使用时,必须依赖 systemPath 元素显性地指定依赖文件的路径,有效范围与 provided 一样;由于此类依赖不是通过 Maven 仓库解析的,往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用;此外,systemPath 元素可以引用环境变量,如 ${java.home} 等。
- import:导入依赖范围,从 Maven 2.0.9 开始支持,此依赖不会对三种 classpath 产生实际影响。
依赖范围(scope) | 编译 classpath | 测试 classpath | 运行 classpath | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
runtime | - | Y | Y | JDBC 驱动实现 |
provided | Y | Y | - | servlet api |
system | Y | Y | - | 本地的,maven 仓库意外以外的 |