介绍

Maven的一个哲学是约定大于配置,所以在maven中,很多内容都有默认值,scope的默认值是compile。

scope元素的作用:控制 dependency(依赖)元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。这个范围包括,编译、测试、运行,并且还可以加上是否被打入包中。

Scope分类

Scope的作用域范围包括compile、test、provided、runtime、system、import。

  1. compile
    此范围为默认依赖范围,是一个比较强的依赖,适用于所有阶段。这些dependencie(依赖)的jar,会传递到其他依赖的上层项目中。由于运行时需要所以编译范围的依赖会被打包,会随着项目一起发布。
    范围:编译、测试、运行(部署)都有效。
  2. test
    表示被依赖项目仅仅参与测试相关的工作,在编译和运行时都不需要,只在编译测试代码或者运行测试代码的时候才能使用该依赖。比较典型的如junit。
    由于运行时不需要所以test范围依赖不会被打包。
    范围:仅测试有效
  3. provided
    provided依赖在编译和测试时需要,在运行时不需要。
    正因为运行时无效,可以防止和tomcat下jar冲突,因为servlet api被tomcat容器提供,就不需要maven再重复引入。
    由于运行时不需要所以provided范围依赖不会被打包。
    范围:编译、测试有效。
  4. runtime
    runtime依赖在运行和测试的时候需要,但在编译的时候不需要。与compile相比,被依赖项目无需参与项目的编译。
    比如:jdbc的驱动包,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
    由于运行时需要所以runtime范围的依赖会被打包。
    范围:测试、运行有效。
  5. system

system范围依赖与provided类似,但是你必须显式的提供一个位于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
如果我们要依赖一个本地的jar包的时候,通常都会使用system和来处理。
比如:

//引用本地jar包
<dependency>
    <groupId>com.mytest</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/lib/test-1.0.jar</systemPath>
</dependency>

如果你仅仅这么依赖了,在SpringBoot打包插件生成jar包的时候,会发现这个jar包不会被打进去,进而出现错误。这个就需要在maven插接中配置一个includeSystemScope属性:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    	<!--设置为true,以便把本地的system的jar也包括进来-->
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

范围:测试、运行有效

总结

  • 依赖范围由强到弱的顺序是:compile>provided>runtime>test
  • scope为test和provide的不会被打包。