pom文件中有个元素是scope 表示构建的依赖范围
<maven 实战>这本书原文片段是如下:
首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath. 在执行测试的时候会使用另外一套classpath.实际运行Maven项目的时候,又会使用一套classpath
我的理解是,maven在编译项目代码的时候 会根据scope 编译需要引入的构件. 比如scope的值为test,那么在编译主项目代码的时候是不会引入该构件值的.
Maven 与以下几种依赖范围:
compile:编译依赖范围.如果没有指定scope的值,就会默认使用该依赖范围.使用此依赖范围,在编译,测试,和运行的时候都会引用该构件
test:测试依赖范围.只有在使用maven执行测试的时候才会引用该构件.在编译主代码或者运行项目的时候都不会引用该构件.典型的例子是JUnit,它只有在编译测试代码及运行 测试的时候才需要.
provided:已提供依赖范围.在编译主项目代码和使用maven进行测试的时候会引用该构件.但在运行时无效.典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运 行项目的时候,由于容易已经提供,就不需要Maven重复地引入一遍.
runtime:运行时依赖范围.使用maven进行测试 和 运行项目的时候会引入该构件.在编译主代码是无效.典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供JDBC接口, 只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动.
system:系统依赖范围.和provided是效果一样.但是使用system范围的依赖必须通过systemPath元素显示的指定依赖文件的路径.由于此类依赖不是通过Maven仓库解析的,而且
往往与本机系统绑定,可能造成构件的不可移值.systemPath元素可以使用环境变量,如:
<dependecy>
<groupId>java.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
import(Maven2.0.9及以上):导入依赖范围.在编译项目主代码,测试 和 运行的时候都不会引入该构件.