scope元素的作用:管制 dependency 元素的应用范畴。艰深的讲,就是管制 Jar 包在哪些范畴被加载和应用。
scope具体含意如下:
compile(默认)
含意:compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖我的项目须要参加到以后我的项目的编译,测试,打包,运行等阶段。打包的时候通常会蕴含被依赖我的项目。
provided
含意:被依赖我的项目实践上能够参加编译、测试、运行等阶段,相当于compile,然而再打包阶段做了exclude的动作。
实用场景:例如, 如果咱们在开发一个web 利用,在编译时咱们须要依赖 servlet-api.jar,然而在运行时咱们不须要该 jar 包,因为这个 jar 包已由应用服务器提供,此时咱们须要应用 provided 进行范畴润饰。
runtime
含意:示意被依赖我的项目无需参加我的项目的编译,然而会参加到我的项目的测试和运行。与compile相比,被依赖我的项目无需参加我的项目的编译。
实用场景:例如,在编译的时候咱们不须要 JDBC API 的 jar 包,而在运行的时候咱们才须要 JDBC 驱动包。
test
含意: 示意被依赖我的项目仅仅参加测试相干的工作,包含测试代码的编译,执行。
实用场景:例如,Junit 测试。
system
含意:system 元素与 provided 元素相似,然而被依赖项不会从 maven 仓库中查找,而是从本地零碎中获取,systemPath 元素用于制订本地零碎中 jar 文件的门路。例如:
<dependency> <groupId>org.open</groupId> <artifactId>open-core</artifactId> <version>1.5</version> <scope>system</scope> <systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath></dependency>
import
它只应用在<dependencyManagement>中,示意从其它的pom中导入dependency的配置,例如 (B我的项目导入A我的项目中的包配置):
想必大家在做SpringBoot利用的时候,都会有如下代码:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version></parent>
继承一个父模块,而后再引入相应的依赖。
如果说,我不想继承,或者我想继承多个,怎么做?
咱们晓得Maven的继承和Java的继承一样,是无奈实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么依照咱们之前的做法,这个父模块的dependencyManagement会蕴含大量的依赖。如果你想把这些依赖分类以更清晰的治理,那就不可能了,import scope依赖能解决这个问题。你能够把dependencyManagement放到独自的专门用来治理依赖的pom中,而后在须要应用依赖的模块中通过import scope依赖,就能够引入dependencyManagement。例如能够写这样一个用于依赖治理的pom:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.test.sample</groupId> <artifactId>base-parent1</artifactId> <packaging>pom</packaging> <version>1.0.0-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactid>junit</artifactId> <version>4.8.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies> </dependencyManagement></project>
而后我就能够通过非继承的形式来引入这段依赖治理配置
<dependencyManagement> <dependencies> <dependency> <groupId>com.test.sample</groupId> <artifactid>base-parent1</artifactId> <version>1.0.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement> <dependency> <groupId>junit</groupId> <artifactid>junit</artifactId></dependency><dependency> <groupId>log4j</groupId> <artifactid>log4j</artifactId></dependency>
留神:import scope只能用在<dependencyManagement>外面
这样,父模块的pom就会十分洁净,由专门的packaging为pom来治理依赖,也符合的面向对象设计中的繁多职责准则。此外,咱们还可能创立多个这样的依赖治理pom,以更细化的形式治理依赖。这种做法与面向对象设计中应用组合而非继承也有点类似的滋味。
那么,如何用这个办法来解决SpringBoot的那个继承问题呢?
配置如下:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies>
</dependencies>
这样配置的话,本人的我的项目外面就不须要继承SpringBoot的module了,而能够继承本人我的项目的module了。
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。
上面是一张nexus画的图: