Maven 教程

Maven 笔记

Maven scope 依赖范围作用及使用详解

Maven 依赖管理详解 Maven 依赖管理详解


首先需要知道,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 产生实际影响。
依赖范围与 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 仓库意外以外的