一篇文章带你了解Maven的依赖范围——scope详解

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个:compileprovidedruntimetestsystemimport

属性值 详解
compile(编译范围) 默认范围 ,该依赖作用于编译、测试、运行。打包时会带上
provided(已提供范围) 该依赖作用于编译、测试、运行。由其它组件提供,打包时去除,比如tomcat提供servlet-api
runtime(运行范围) 该依赖作用于测试和运行,不参与编译。打包时会带上
test(测试范围) 该依赖作用于测试,不参与编译和运行,打包时去除
system (系统范围) 依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找(不常见)
import 该依赖从父类中集成,使用条件比较苛刻 (不常见)

scope标签的属性值中的最后两个:systemimport比较难理解,(而且也很少用)举两个例子。

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值,是testprovided 时,它将直接被丢弃,A项目不会依赖C项目。

若是testprovided之外的值,那么A项目依赖C项目,C继承B项目的scope

参考文档

Maven官方文档:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

猜你喜欢

转载自blog.csdn.net/single_0910/article/details/121140389