前言
最近在项目开发中发现有些同学对于maven中scope的使用还不太了解,今天给大家详细介绍一下。
Maven中scope的作用
Maven中使用 scope 来指定当前依赖包的有效范围、是否传递、是否会被打包。常见的可选值有:compile, provided, runtime, test, system 等。scope 主要是用在 pom.xml 文件中的依赖定义部分,默认值为compile。
scope各种取值详解
compile :为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。支持传递。打包时会被包含进去。
provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,容器已经提供,就不需要Maven重复地引入一遍了。不支持传递。打包时不会被包含进去。
runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。支持传递。打包时会被包含进去。
test :只在测试时有效,包括测试代码的编译,执行。例如:JUnit。不支持传递。打包时不会被包含进去。
system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过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。
网友评论