scope是限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。
自2.0.9版本发布后,新增了一种:import,现在已经有了6种scope。
下面分别来说明:
compile:不声明scope元素的情况下的默认值。compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
provided:这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servletAPI。和数据库连接jdbc,该依赖理论上可以参与编译,测试,运行等周期,但是不会被打包到最终的artifact中。
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
例如:
<!-- 因为在代码编译期可能需要使用JDBC API(例如:重写数据源连接方式),所以作用域设置为provided ,
而在运行的时候才需要JDBC的驱动才可以。所以下面的数据库连接作用域一般都设置为runtime-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>provided</scope>
</dependency>
<!-- 数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
runtime:这种作用域的依赖只会在测试和运行期可用,不需要参与项目的编译。这些依赖将会被打包到最终的artifact中。与compile相比,跳过了编译而已。典型的例子是:JDBC驱动,适用运行和测试阶段。比如你有一个基于web的应用需要在运行时才访问MySQL数据库。你的代码仅仅是基于JDBC API来编写,也就是说只在编译期需要JDBC API JAR,而在运行的时候才需要JDBC的驱动实现。
test:只参与测试工作过程中的测试和执行,典型的例子就是:JUnit,但是这些依赖不会被打包到最终的artifact中。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
system:和provided scope很像。唯一的区别在于,在system scope中,你需要告诉Mave如何去找到这个依赖(方法是通过systemPath属性来指定依赖的路径),如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
import:从其它的pom文件中导入依赖设置,它只在在dependencyManagement元素下使用,表示从其他pom中导入dependency的配置。
原文地址:https://www.jianshu.com/p/ebe51f83425a