scope(依赖的范围)解析
- 编译阶段,使用 -> 编译classpath
- 测试阶段,使用-> 测试classpath
- 运行阶段,使用-> 运行classpath
依赖范围就是规定在哪个阶段起作用而已。
依赖范围:
-
compile:编译依赖范围。如果没有指定scope默认就是此依赖范围。使用此依赖范围的maven依赖,对应编译,测试和运行三种classpath都有效。例:spring-core,在编译,测试和运行的时候都需要使用该依赖。
-
test:测试依赖范围。使用此依赖范围的maven依赖,只对于测试classpath有效,在编译主代码或者运行项目时都无法使用此类依赖。例:Junit,它只在编译测试代码或者运行测试代码的时候才能使用该依赖。
-
provided:已提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行classpath无效。典型的例子:servlet-api,编译和测试的时候需要该依赖,但是运行项目的时候,由于容器已经提供(例如Tomcat中lib下已经有servlet-api.jar包),就不需要maven再重复引入。
-
runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于运行和测试classpath有效,但在编译classpath无效。典型例子:JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
-
system:系统依赖范围。该依赖与三种classpath的关系,与provided依赖范围完全一致。但是使用system范围的依赖时必须通过元素显式地指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往是与本机系统绑定,可能造成构件的不可移植性,所以要谨慎使用。
- system 的配置 demo
<dependency>
<groupId>xxxx</groupId>
<artifactId>xxxx</artifactId>
<scope>system</scope>
<version>1.1.0</version>
<systemPath>${basedir}\xxxx</systemPath>
</dependency>