【Maven】Maven之scope依赖范围

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仓库以外的类库文件
相关文章
相关标签/搜索