scope详解
Maven存在着编译、测试、打包,部署,运行等生命周期。
在这些生命周期中…
有些依赖只用于测试,比如Junit。
有些依赖只有运行时才能用到,编译用不到,比如MySQL驱动包只在运行时用到(编译后使用的是JDBC接口)
还有些依赖,编译期用到,运行期不需要,因为有些容器已经提供了,比如servlet-api在tomcat中已经提供,我们只需要在编译期使用,项目上线后由tomcat提供。
在pom.xml中,是通过dependency
中的scope
标签来管理依赖的范围。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
scope的六大属性值
scope
标签的属性值有6个:compile、provided、runtime、test、system、import。
属性值 | 详解 |
compile(编译范围) | 默认范围 ,该依赖作用于编译、测试、运行。打包时会带上 |
provided(已提供范围) | 该依赖作用于编译、测试、运行。由其它组件提供,打包时去除,比如tomcat提供servlet-api |
runtime(运行范围) | 该依赖作用于测试和运行,不参与编译。打包时会带上 |
test(测试范围) | 该依赖作用于测试,不参与编译和运行,打包时去除 |
system (系统范围) | 依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找 |
import | 该依赖从父类中集成,使用条件比较苛刻 |
scope
标签的属性值中的最后两个:system
和import
比较难理解,(而且也很少用
)举两个例子。
system
依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,需要 systemPath 属性
<dependency>
<groupId>com.taobao.sdk</groupId>
<artifactId>taobao-sdk</artifactId>
<version>2.2.1</version>
<!--system,类似provided,需要显式提供依赖的jar包,Maven不会从仓库中查找它-->
<scope>system</scope>
<!--项目根目录下的lib文件夹下-->
<systemPath>${basedir}/lib/taobao-sdk-2.2.1.jar</systemPath>
</dependency>
其中 ${basedir}
是Maven的预定义内置属性,表示项目根目录,即包含pom.xml文件的目录。
import (依赖继承)
该依赖从父类中继承
官方文档介绍如下:
翻译,翻译:
import 属性只能在 dependencyManagement
标签中使用,并且需要设置type
属性为pom
这个type标签,我们一般不写,其实默认值是jar,表示导入的是一个jar包。
现在显示定义为pom,表示导入的是一个父模块,scope定义为import,代表把父模块中的jar包导入进来
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
scope 的传递依赖
A -> B -> C,
假设,A项目依赖于B项目,B项目依赖于C项目,如果知道B在 A中的scope值,如何确定 C在 A 中的 依赖范围?
A项目是否需要C项目,本质上,是由C项目在B项目中的scope值决定的
如果C项目在B项目中的scope值,是test
或 provided
时,它将直接被丢弃,A项目不会依赖C项目。
若是test
或 provided
之外的值,那么A项目依赖C项目,C继承B项目的scope
参考文档
Maven官方文档:http:///guides/introduction/introduction-to-dependency-mechanism.html