Java学习路线:Maven(二)scope、optional和exclusions
目录
scope
optional
exclusions
我们知道,一般来说一个依赖由三个基本的属性作为定位坐标,即groupId、artifactId和version
除了这三个基本属性以外,依赖还可以添加其他的属性,例如scope、optional和exclusions等
这篇文章将对这几种属性进行介绍
scope
scope决定了依赖作用的范围,就和注解中的Retention相似
scope有以下几种值:
- compile:默认值,表示依赖在编译、运行、测试时均有效
- provided:在编译、测试时有效,运行时无效
- runtime:在运行、测试时有效,编译时无效
- test:只在测试时有效
以上四种值都针对于在远程仓库中下载的依赖
那如果我们使用的依赖没有上传远程仓库,只是一个本地的jar包应该怎么办呢?
这种情况可以使用第五种作用域:
- system:和provided作用域一样,但是不是从远程仓库获取,而是直接导入本地jar包
如果使用system,需要增加一个属性systemPath来找到本地jar包的地址
<dependency>
<groupId>org.junit.xxx</groupId>
<artifactId>xxx</artifactId>
<version>5.11.3</version>
<scope>system</scope>
<systemPath>C://user/test.jar</systemPath>
</dependency>
optional
当某个依赖的 optional
设置为true时,Maven 不会自动将该依赖传递给依赖于当前项目的其他项目
<optional>true</optional>
optional主要应用于传递依赖,例如,你的项目 A 依赖于 B,B 又依赖于 C,那么 A 也会自动依赖于 C,但是当C被设置为optional后,在A项目中导入B时,C不会被自动导入
exclusions
exclusions
用于排除传递性依赖,即阻止特定的依赖自动传递到项目中。
例如,假设项目依赖 spring-core
,而 spring-core
默认依赖 commons-logging
。如果想排除 commons-logging
,可以这样配置:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
可以这样理解optional和exclusions:
optional
:由发送方(依赖方)声明这个依赖是“可选的”,告诉 Maven 不要自动传递这个依赖给下游项目exclusions
:由接收方(依赖的使用方)声明不想要某些传递性依赖,从而“拒绝”这些依赖被引入项目中