目录
前述
scope中在maven项目依赖管理中,负责管理依赖是否参与测试、打包、编译、运行周期,以及依赖之间的传递性。
有compile,test,runtime,provided,system五个参数,默认为compile
详述
compile:
默认,表示该依赖参与项目的:测试、打包、编译、运行周期。表示该依赖是一个比较强的依赖。
test:
见名知意,表示该依赖仅参与测试相关工作,可以对测试代码进行编译、执行。但不会被打包,如:junit
runtime:
表示该依赖参与运行、测试、打包,但不参与编译周期,与complie相比,跳过了编译期。例如:JDBC驱动
provided:
表示该依赖 参与编译、运行、测试周期,但不参与打包。
system:
system与provided相同,区别在于,system表示该依赖是不是从maven仓库获取,而是从本地系统文件获取的,并且需要添加一个systemPath属性参数。
例子如下:
<dependency> <groupid>org.hamcrest</groupid> <artifactid>hamcrest-core</artifactid> <version>1.5</version> <scope>system</scope> <systempath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systempath> </dependency>
import
这里提到import,是maven在2.0.9版本后添加的,用来解决pom的单继承问题。
比如springboot项目中,通过<parent>继承Spring-boot-starter-parent来引用springboot默认依赖,但可能又需要继承公司的<parent>,但<parent>只能继承一个,此时,可以在<dependencyManagement>中使用<scope>import</scope>来配置新的<parent>。import并不限制依赖关系传递性
代码示例如下:
已经继承了springboot的默认依赖
<!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.BUILD-SNAPSHOT</version> </parent>
此时又需要继承公司的<parent>,但<parent>只能单继承,可以如下方式解决:
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.1.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
通过上面方式,就可以获取spring-boot-dependencies.2.0.1.BUILD-SNAPSHOT.pom文件中dependencyManagement配置的jar包依赖。
但如果想要再多依赖一些,可以继续添加<dependency>
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.1.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 新添加 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.1.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
import能解决maven单继承问题,但并不参与限制依赖关系的传递性。
scope的依赖传递性
举个例子,让我们更好的理解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。
总结:
对于maven中的scope还是挺重要的,尤其是依赖之间的关系传递,是我们在项目中解决依赖问题的关键,更好的理解scpoe,也更有利于我们了解在maven的依赖管理机制中,依赖之间的关系是怎样的。
如果您有疑惑,或者其他见解,希望及时留言交流。
参考文档:
https://blog.csdn.net/cd18333612683/article/details/66478332
https://blog.csdn.net/u010002184/article/details/87989164
https://blog.csdn.net/blueheart20/article/details/81014116
https://blog.csdn.net/leoxyk/article/details/79622507