Maven scope详解
示例
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
scope分类
- compile(默认): 不配置scope时默认是compile。它表示被依赖项目需要参与当前项目的
编译
,后续的测试
、运行
周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去 - test: 表示依赖项目仅仅参与测试相关工作,只在测试的
编译
,运行
阶段。如单元测试 - runntime: 表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。只是跳过编译,如jdbc驱动
- provided: 表示只能作用在本项目的
编译
、测试
阶段,打包时不会被打进去,例如lombok - system: 从参与角度来说,与provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,必须要配合systemPath属性使用
- import: 导入的范围,它只在dependencyManagement中使用,表示从其它pom中导入dependency的配置
scope的传递依赖
A->B->C。当前项目A,A依赖于B,B依赖于C。直到B在A项目中的scope,那么怎么知道C在A中的scope呢?
当C是test
或provided
时,C直接被丢弃,A不依赖C;否则A依赖C,C的scope继承于B的scope
下面是直接依赖和间接依赖的传递关系
Direct Scope\Transitive Scope | compile | provided | runtime | test |
---|---|---|---|---|
compile | compile | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |